2014-09-21 66 views
1

我閱讀以下問題和答案: Share data between AngularJS controllers, Update scope value when service data is changed, 和Angular: Update service and share data between controllers在Angular中的控制器之間共享數據,觀看還是不觀看?

我的問題是關於提供的答案。答案通常建議$watch,我不明白爲什麼。

我想控制器之間共享一些價值,所以我只是這樣做(這是代碼的簡化):

angular.module('app', []) 
.factory('SomeSharedData', function() 
{ 
    return { 'pointer' : { 'someKey' : 'someValue' }}; 
}) 

.controller('Controller1', ['$scope', 'SomeSharedData', function($scope, SomeSharedData) { 
    $scope.pointer = SomeSharedData.pointer; 
}]) 

.controller('Controller2', ['$scope', 'SomeSharedData', function($scope, SomeSharedData) 
{ 
    $scope.pointer = SomeSharedData.pointer; 
}]); 

是由於某種原因,這個inheritly邪?

爲什麼使用這樣的:

$scope.$watch(function() { return SomeSharedData.someKey(); }, function (newValue) { 
    if (newValue) $scope.someKey = newValue; 
}); 
+1

取決於你想要達到的目標。在你的第一個例子中,當控制器第一次運行時,'pointer'的值將被設置,並且如果'SomeSharedData.pointer'在別處改變,將不會更新。如果這就是你所需要的,那麼$ watch是不必要的。如果你想要引用'SomeSharedData.pointer'的所有實例之間的數據綁定,你需要使用類似代碼的第​​二部分。 – 2014-09-21 15:45:17

回答

1

它實際上取決於你的情況在控制器中的指針變量將被設置爲SomeSharedData工廠指針變量。所以在你的情況下不需要使用$ watch,因爲變量將被設置一次。

但是,如果您希望在控制器中的指針變量發生變化時做些什麼。你不會知道,如果你不使用$ watch(這就是$ watch的用途),指針變量是否已經改變。

像,舉個例子。在這裏我創建了一個叫做指針的模型,我正在觀察變化,如果有任何變化,計數每次增加1。在這種情況下,$ watch是必要的。所以,如果在任何情況下,如果模型發生變化,您想要做些什麼,您可以使用$ watch。

的index.html

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Angular $watch</title> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"></script> 

</head> 
<body> 
<div ng-app="myApp"> 
    <div ng-controller="myCtrl"> 
     <input type="text" ng-model="pointer"> 
     {{pointer}} 
     <br> 
     <h3>Will increase if input changes:<h1>{{count}}</h1></h3> 
    </div> 
</div>   

    <script src="main.js"></script> 
</body> 
</html> 

main.js

var myApp = angular.module('myApp', []); 

myApp.controller('myCtrl', ['$scope', function ($scope) { 
    $scope.count = 1; 
    $scope.$watch('pointer', function(newValue, oldValue) { 
     if (newValue !== oldValue) { 
      $scope.count += 1; 
     }   
    }); 
}]); 
+0

因此,如果'onChange'指令用於監視外部(來自用戶)的變化,'$ watch'用於響應來自內部的變化:服務和其他控制器? – zehelvion 2014-09-21 18:32:58