AngularJS 控制器未由工厂更新
AngularJS controller not updated by factory
我有两个控制器和一个工厂。第一个控制器向服务器发出 http 请求并取回它写入工厂的字符串。然后应该使用新字符串更新第二个控制器,但这并没有发生。
相关代码:
...
.factory('user', function() {
return {
name: {str: ''},
passwordHashed: {str: ''},
userType: {str: 'none'},
};
})
.controller('nav', ['$scope', 'user', function($scope, user) {
$scope.allSites = [
//example what a page looks like, i have several more pages and several more usertypes
{name: 'home', title: 'Home', allowed: ['none', 'admin']},
];
$scope.allowedSites = []; //displayed in navigation
angular.forEach($scope.allSites, function(site) {
if(contains(site.allowed, user.userType.str) != -1) $scope.allowedSites.push(site);
});
}])
.controller('loginCTRL', ['$scope', '$http', 'user', function($scope, $http, user) {
$http.get('url').success(function(data) {
//some code
user.name.str = $scope.enteredUsername;
user.passwordHashed.str = $scope.passwordHashed;
user.userType.str = data; //admin
});
});
这应该会在每次 userType 更改时重新生成导航,但是在登录之后什么也没有发生。我四处搜索,有些帖子说,你应该将字符串放入单独的对象中,但这并没有解决任何问题。我仍然保留它(所有这些 {str: 'bla'}
东西)。
如果你在这个服务(顺便说一句,不是工厂)和这些控制器的代码中放置一些断点,你会看到控制器初始化也发生了'early',这意味着您还没有正确的服务状态。
这是因为依赖注入机制。
您的控制器只会启动一次状态。如果你想更新它的状态,你必须将相关代码放在 refresh() 函数中,并以某种方式在你的服务准备好时调用它。
有几种方法可以做到这一点,例如,您可以在这里查看:
http://www.codeproject.com/Tips/773147/Communication-between-the-Controllers-in-AngularJS
查看您的代码,这里有一些关于如何完成的建议:
- 将
$routeProvider
与 "acl" 等自定义属性一起使用。使用数值。
使用:
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeStart', function (event, nextRoute, currRoute) {
创建重定向拦截器。
ACL属性的数值比较:if (user.acl < route.acl)
简洁明了:)
顺便说一句。您可以在控制器中使用 $watch 来观察工厂的变化并对其做出反应。
我有两个控制器和一个工厂。第一个控制器向服务器发出 http 请求并取回它写入工厂的字符串。然后应该使用新字符串更新第二个控制器,但这并没有发生。
相关代码:
...
.factory('user', function() {
return {
name: {str: ''},
passwordHashed: {str: ''},
userType: {str: 'none'},
};
})
.controller('nav', ['$scope', 'user', function($scope, user) {
$scope.allSites = [
//example what a page looks like, i have several more pages and several more usertypes
{name: 'home', title: 'Home', allowed: ['none', 'admin']},
];
$scope.allowedSites = []; //displayed in navigation
angular.forEach($scope.allSites, function(site) {
if(contains(site.allowed, user.userType.str) != -1) $scope.allowedSites.push(site);
});
}])
.controller('loginCTRL', ['$scope', '$http', 'user', function($scope, $http, user) {
$http.get('url').success(function(data) {
//some code
user.name.str = $scope.enteredUsername;
user.passwordHashed.str = $scope.passwordHashed;
user.userType.str = data; //admin
});
});
这应该会在每次 userType 更改时重新生成导航,但是在登录之后什么也没有发生。我四处搜索,有些帖子说,你应该将字符串放入单独的对象中,但这并没有解决任何问题。我仍然保留它(所有这些 {str: 'bla'}
东西)。
如果你在这个服务(顺便说一句,不是工厂)和这些控制器的代码中放置一些断点,你会看到控制器初始化也发生了'early',这意味着您还没有正确的服务状态。
这是因为依赖注入机制。
您的控制器只会启动一次状态。如果你想更新它的状态,你必须将相关代码放在 refresh() 函数中,并以某种方式在你的服务准备好时调用它。
有几种方法可以做到这一点,例如,您可以在这里查看: http://www.codeproject.com/Tips/773147/Communication-between-the-Controllers-in-AngularJS
查看您的代码,这里有一些关于如何完成的建议:
- 将
$routeProvider
与 "acl" 等自定义属性一起使用。使用数值。 使用:
app.run(function ($rootScope, $location) { $rootScope.$on('$routeChangeStart', function (event, nextRoute, currRoute) {
创建重定向拦截器。
ACL属性的数值比较:
if (user.acl < route.acl)
简洁明了:)
顺便说一句。您可以在控制器中使用 $watch 来观察工厂的变化并对其做出反应。