我读了以下问题和答案: Share data between AngularJS controllers, Update scope value when service data is changed, 和Angular: Update service and share data between controllers。
我的问题是关于提供的答案。答案通常建议$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;
}]);
这是因为某些原因继承了邪恶吗?
为什么要使用类似的东西:
$scope.$watch(function () { return SomeSharedData.someKey(); }, function (newValue) {
if (newValue) $scope.someKey = newValue;
});
答案 0 :(得分: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;
}
});
}]);