Javascript AngularJS监视工厂对象的属性-意外行为

Javascript AngularJS监视工厂对象的属性-意外行为,javascript,angularjs,factory,watch,Javascript,Angularjs,Factory,Watch,我想了解AngularJS在观察工厂提供的对象变化时的某种行为 根据我是在控制器中还是在html中读取工厂提供的对象的属性,会有不同的行为 比较以下两种在视图中显示属性的方式: app.controller("testController", function($scope, testFactory){ $scope.test_obj = testFactory.read(); $scope.test_prop = testFactory.read().prop; }); &l

我想了解AngularJS在观察工厂提供的对象变化时的某种行为

根据我是在控制器中还是在html中读取工厂提供的对象的属性,会有不同的行为

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

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>
app.controller(“testController”,函数($scope,testFactory){
$scope.test_obj=testFactory.read();
$scope.test_prop=testFactory.read().prop;
});
{{test_obj.prop}}
{{test_prop}}
当testFactory中的属性发生更改时,只有在第一种情况下,当整个对象声明为作用域并且在视图中调用属性时,才会在视图中更新更改。当属性直接声明给作用域时,它不会在视图中自动更新

可以在以下JSFIDLE中观察到这种行为:


这种行为的原因是什么?

我想说,
$scope.test\u obj
是对工厂的
obj
的引用,而
$scope.test\u prop
obj.prop
的复制值

如果将以下内容添加到示例中:

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

您会看到read方法将返回一个对象,read().prop将返回一个值


在上行中,prop的初始值为0。在javascript中,数字是按值复制的,而对象/数组是按引用复制的$scope.test\u obj引用的是服务对象,而$scope.test\u prop不是。

这很有道理!为什么$scope.test_obj会变成一个引用,$scope.test_prop会变成一个副本,而不是一个引用?是的,我知道会返回不同的类型,一个对象和一个值。我错过了关于您答案第一部分的知识——在javascript中声明变量时,数字将被复制,对象将被引用。谢谢你的帮助!