在Angular中控制器之间共享数据,观看还是不观看?

时间:2014-09-21 15:35:17

标签: javascript angularjs angularjs-service

我读了以下问题和答案: Share data between AngularJS controllersUpdate 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;
});

1 个答案:

答案 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;
        }        
    });
}]);