0
我正在使用包含列表和方法來處理該列表的服務。服務在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;
});
}]);
我明白了,正如我懷疑的那樣。超越這個障礙,我是否認爲使用$ apply()是多餘的? –
@KG Christensen:這對'$ apply()'沒有問題。主要問題是原始引用('$ scope.lights')不會更改。 –
對,謝謝。對於直接引用服務的建議,還應該解決它。 –