2017-06-06 55 views
1

我想了解AngularJS在观察工厂提供的对象变化时的某种行为。AngularJS观察工厂对象的属性 - 意外行为

有一个不同的行为取决于我是否读取控制器或html中的工厂提供的对象的属性。

比较在视图中显示的属性的以下2种方式:

app.controller("testController", function($scope, testFactory){ 
    $scope.test_obj = testFactory.read(); 
    $scope.test_prop = testFactory.read().prop; 
}); 

<div>{{test_obj.prop}}</div> 
<div>{{test_prop}}</div> 

当在TestFactory中的属性发生变化时,改变在所述图仅在第一种情况下,更新当整个对象是声明为范围,并在视图中调用该属性。当该属性直接声明为范围时,它不会在视图中自动更新。 https://jsfiddle.net/fb86p4fm/

什么是对这种现象的原因:

这种行为可以在下面的jsfiddle观察?

回答

2

$ scope.test_prop = testFactory.read()。prop;

在上面的行中,prop的初始值为0.在javascript中,数字是通过值复制的,但对象/数组是通过引用。 $ scope.test_obj引用服务对象,而$ scope.test_prop不是。

1

我会说,$scope.test_obj是工厂的obj$scope.test_prop一个参考的obj.prop复制的价值。

如果你添加以下到您的例子:

console.log(testFactory.read()); // output : Object {prop: 0} 
console.log(testFactory.read().prop); // output 0 

你会看到read方法会返回一个对象,并读取()丙会返回一个值。

+0

这使得很多感!为什么$ scope.test_obj成为一个参考,$ scope.test_prop成为一个副本,而不是一个参考? –

+0

@JohnRose查看更新 –

+0

是的,我知道不同的类型正在返回,一个对象和一个值。我错过了关于第一部分答案的知识 - 当在javascript中声明变量时,数字将被复制并引用对象。感谢您的帮助! –