2014-06-15 68 views
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; 
    }); 

}]); 

回答

2

是我的問題,我需要更換整個列表或其他什麼東西?

是的,當你執行這個代碼:

$scope.lights = MyHome.lights; 

參考複製到$scope.lights。兩者都引用內存中的同一對象,但引用($scope.lightsMyHome.lights)存儲在單獨的內存塊中。因此,當您將MyHome.lights替換爲另一個對象時,MyHome.lights引用了一個新對象,但$scope.lights仍引用原始內存塊

你可以嘗試:

$scope.MyHome = MyHome; 

和修改模板綁定添加MyHome前綴。

+0

我明白了,正如我懷疑的那樣。超越這個障礙,我是否認爲使用$ apply()是多餘的? –

+0

@KG Christensen:這對'$ apply()'沒有問題。主要問題是原始引用('$ scope.lights')不會更改。 –

+0

對,謝謝。對於直接引用服務的建議,還應該解決它。 –

相關問題