我看到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;
}
答案 0 :(得分:1)
区别在于:
$scope.fromFactory = testFactory.get();
<div ng-controller="GoodbyeCtrl">
<p> {{fromFactory.name}}</p>
</div>
$scope
变量设置为testFactory.get()
,这是一个对象参考。在每个摘要周期中,观察者使用对象引用获取属性name
的值。 DOM会随着对该属性的更改而更新。
$scope.fromFactory = testFactory.get().name;
<div ng-controller="GoodbyeCtrl">
<p>{{fromFactory}}</p>
</div>
$scope
变量设置为testFactory.get().name
,这是主要。在每个摘要周期中,主要值不会改变。
重要的区别在于,当一个引用值传递给一个函数,并且一个函数修改了它的内容时,调用者和任何其他引用该对象的函数都会看到该更改。