编辑:如我所知,我会更有效地解释一下!
我最近一直坐在一个恼人的问题面前,这就是每当我更新一个指令内的值时,控制器我当前都没有"在"是唯一可以正确更新的。
场景示例:“配置文件”页面由两个控制器组成。 Navbar_controller,它当前只显示用户名:
<div ng-if="Auth.isAuthenticated">Hello, {{Auth.getCurrentUser().name}}</div>
第二个控制器,Profile_controller用于更新用户值。这是角度第一控制器中的一个简单功能,它更新了CurrentUser:
$scope.updateUser = function (type, form) {
if (!$scope.modif)
return ;
$http.put('/api/users/' + Auth.getCurrentUser()._id + '/update', {type:type, modif:$scope.modif})
.success(function (data, status) {
$scope.user = Auth.setNewUser(data);
})
.error(function () {
console.log("error");
});
};
例如,当我更新名称时。我可以看到数据库已被正确修改。实际上,navbar_controller得到了更新,因为在div中打印了一个新名称。但是,Profile_controller无法获得更新:个人资料页面中打印的名称无法更改。
以下是Auth.service.js中的两个基本功能:
getCurrentUser: function() {
return currentUser;
},
// 'user' is the data retrieved in http put request dot success
setNewUser: function(user) {
currentUser = user;
$rootScope.$broadcast(); // Navbar_controller is updated with or without this line
return currentUser;
}
无论如何,如果我查看导航栏及其控制器(调用Auth.getCurrentUser()方法),则会立即修改用户值。我一直在使用一种丑陋的方法,包括手动修改控制器值或刷新页面......但这不是一条路,对吧?
必须有&#34; $ rootScope。$ broadcast();&#34;,但我对Angular很新,而stackoverflow上的其他问题太具体了,无法帮助我理解。< / p>
谢谢!
答案 0 :(得分:0)
您的问题有点难以理解,但我认为问题在于您在各种控制器中引用了一个不断变化的对象。这是一个解释的例子:
服务:
var myObject = { ... };
return {
getObject() { return myObject; }
setObject(obj) { myObject = obj; }
};
控制器1:
$scope.myObjA = Service.getObject();
控制器2:
$scope.myObjB = Service.getObject();
现在初始化时,两个控制器都将引用相同的对象,因此如果您更改了任一控制器内的属性(例如$scope.myObjB.name = 'bob';
),那么另一个控制器也会看到该名称。
但是,如果您在控制器中更改了对象本身(例如Service.setObject(newObj);
),则控制器将引用新对象,而另一个控制器仍将引用旧对象。
您可以通过将服务对象包装在容器中来解决此问题:
var cont = {
user: ...
};
function getContainer() { return cont; }
function setNewUser(user) { cont.user = user; }
然后在你的控制器内,获取容器(而不是用户):
$scope.cont = Service.getContainer();
在你的HTML中:
<div>{{cont.user.name}}</div>
现在,当您更新用户时,将更新所有连接的控制器。
答案 1 :(得分:0)
好吧,我会尝试在$ rootScope中更改和存储用户信息,因为您的场景可能非常合适。
getCurrentUser: function() {
$rootScope.currentUser===undefined ? 'no User': $rootScope.currentUser;
},
setNewUser: function(user) {
$rootScope.currentUser = user;
//$rootScope.$broadcast(); no need to broadcast
return getCurrentUser();
}
以这种方式,currentUser将根据需要在不同的范围内更新!
我将引用AnuglarJs FAQ关于$ rootscope:
$ rootScope存在,但它可以用于邪恶
偶尔会有一些您想要全局化的数据 整个应用程序。对于这些,您可以注入$ rootScope并设置值 它像任何其他范围。由于范围继承自根范围, 这些值可用于附加的表达式 像ng-show这样的指令就像本地$ scope的值一样。
当然,全球状态很糟糕,你应该谨慎使用$ rootScope, 就像你希望用任何语言的全局变量一样。 特别是,不要将它用于代码,只用于数据。如果你很想 把一个函数放在$ rootScope上,把它放在一个几乎总是更好 可以在需要的地方注入,更容易注入的服务 测试
相反,不要创建一个生活中唯一目的的服务 存储并返回数据位。