2017-06-06 51 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中聲明變量時,數字將被複制並引用對象。感謝您的幫助! –