我正在使用一个服务,该服务包含一个列表和操作该列表的方法。服务在中初始化,app.run()
并在多个控制器之间共享。
NavCtrl
包含一种用于更新整个列表的方法,而FutureHomeCtrl
仅保留对该列表的引用以与ngRepeat(和其他指令)一起使用。
由于实际列表包含在服务中,并通过在FutureHomeCtrl
的引用进行分配$scope
,因此我认为Angular会自动检测到并消化列表的任何更改。但是,如果我使用手动重新设置对服务列表的引用,则只能刷新列表$broadcast
。
我替换整个列表还是其他问题?我应该提一下,我也曾尝试过$apply()
没有运气-再说一次,我认为那不是必须的吗?
// Part of Service
MyHome.toggleAllLights = function (command) {
var deffered = $q.defer();
if (command && command === 'on') {
// Works
MyHome.Lights.turnOnAll().$promise.then(function (lights) {
MyHome.lights = lights;
$rootScope.$emit('MyHome.lightsUpdate');
deffered.resolve();
});
} else {
// Doesn't work
MyHome.Lights.turnOffAll().$promise.then(function (lights) {
MyHome.lights = lights;
deffered.resolve();
});
}
return deffered.promise;
};
.controller('NavCtrl', ['$scope', 'MyHome', function ($scope, MyHome) {
$scope.toggleAllLights = function (command) {
MyHome.toggleAllLights(command).then(function () {
console.log(MyHome.lights);
});
};
}])
.controller('FutureHomeCtrl', ['$rootScope', '$scope', 'MyHome', function ($rootScope, $scope, MyHome) {
$scope.lights = MyHome.lights;
$rootScope.$on('MyHome.lightsUpdate', function () {
$scope.lights = MyHome.lights;
});
}]);
我替换整个列表还是其他问题?
是的,当您执行以下代码时:
$scope.lights = MyHome.lights;
参考被复制到$scope.lights
。两者都引用内存中的同一对象,但引用($scope.lights
和MyHome.lights
)存储在单独的内存块中。因此,当您MyHome.lights
用另一个对象替换时,MyHome.lights
引用一个新对象,但$scope.lights
仍引用原始内存块。
您可以尝试:
$scope.MyHome = MyHome;
并修改您的模板绑定以添加MyHome
前缀。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句