两个控制器之间的通信;参考文献与Primatives

时间:2016-05-10 12:59:05

标签: angularjs pass-by-reference angular-services angular-controller

我看到Angularjs的工厂出现意外行为。 我用工厂在两个控制器之间进行通信。

在第一个场景中,它运行正常但不在第二个场景中。它们之间的唯一区别是,在第一个示例中,我从视图中访问名称,但在第二个示例中,我在范围变量中访问。

情景1

<div ng-controller="HelloCtrl">
    <a ng-click="setValue('jhon')">click</a>
</div>
<br />
<div ng-controller="GoodbyeCtrl">
    <p>{{fromFactory.name}}</p>
</div>

//angular.js example for factory vs service
var app = angular.module('myApp', []);

    app.factory('testFactory', function() {
        var obj = {'name':'rio'};
        return {
            get : function() {
                return obj;
            },
            set : function(text) {
               obj.name = text;
            }
        }          
    });

    function HelloCtrl($scope, testFactory) {
        $scope.setValue = function(value) {
            testFactory.set(value);
        }
    }

    function GoodbyeCtrl($scope, testFactory) {
        $scope.fromFactory = testFactory.get();
    }

场景2

<div ng-controller="HelloCtrl">
    <a ng-click="setValue('jhon')">click</a>
</div>
<br />
<div ng-controller="GoodbyeCtrl">
    <p>{{fromFactory}}</p>
</div>

//angular.js example for factory vs service
var app = angular.module('myApp', []);
    app.factory('testFactory', function() {
        var obj = {'name':'rio'};
        return {
            get : function() {
                return obj;
            },
            set : function(text) {
               obj.name = text;
            }  
        }               
    });

    function HelloCtrl($scope, testFactory) {
        $scope.setValue = function(value) {
            testFactory.set(value);
        }
    }
    function GoodbyeCtrl($scope, testFactory) {
        $scope.fromFactory = testFactory.get().name;
    }

1 个答案:

答案 0 :(得分:1)

区别在于:

情景I

$scope.fromFactory = testFactory.get(); 

<div ng-controller="GoodbyeCtrl">
<p>  {{fromFactory.name}}</p>
</div>

$scope变量设置为testFactory.get(),这是一个对象参考。在每个摘要周期中,观察者使用对象引用获取属性name的值。 DOM会随着对该属性的更改而更新。

情景II

$scope.fromFactory = testFactory.get().name;

<div ng-controller="GoodbyeCtrl">
    <p>{{fromFactory}}</p>
</div>

$scope变量设置为testFactory.get().name,这是主要。在每个摘要周期中,主要值不会改变。

重要的区别在于,当一个引用值传递给一个函数,并且一个函数修改了它的内容时,调用者和任何其他引用该对象的函数都会看到该更改。