2016-09-15 30 views
2

我知道大多數人在HTML中顯示的變量中引用了雙向綁定,但我仍然遇到了同樣的問題,意識到Angular有一些基本的東西,我不理解。初始化變量等於另一個,而沒有將來的變化,前者會影響後者在AngularJS

爲了解決這個問題,我正在開發一款RPG瀏覽器遊戲。我想每一個字符都被表示爲baseStats:

'baseStats' : { 
    'defense' : 5, 
    'strength' : 3, 
    'speed' : 7 
} 

,但戰鬥的過程中,他們可能會被「磨光」或「debuffed」,所以我希望能夠跟蹤這些變化不會永久更改角色統計信息,因此baseStats存在以保留統計信息的「原始」狀態。

vm.restoreAll = function() { 
    angular.forEach(vm.activeAllies, function(ally) { 
    ally.stats.defense = ally.baseStats.defense; 
    ally.stats.strength = ally.baseStats.strength; 
    ally.stats.strength = ally.baseStats.speed; 
    }); 
}; 

這與我的打算完全相同。所有這些統計數據被重置爲baseStat

vm.restoreAll = function() { 
    angular.forEach(vm.activeAllies, function(ally) { 
    ally.stats = ally.baseStats; 
    }); 
} 

這顯然是更具可讀性和簡潔,但不幸的是,如果我更改從應用程序的其他地方ally.stats,這些變化影響baseStats爲好。我很困惑,爲什麼會這樣,因爲他們似乎有效地完全相同。

+0

聽起來像你想使用angular.copy()https://開頭docs.angularjs.org/api/ng/function/angular.copy該頁面上的示例顯示了您正在詢問的內容 – Ronnie

+0

這確實給了我預期的結果...謝謝!但是我仍然困惑爲什麼Angular在看起來語法上相同的情況下似乎以兩種不同的方式行事。 –

+1

因爲'ally.stats'只是對'ally.baseStats'的引用。這不是一個副本,這就是爲什麼angular.copy()存在的原因 – Ronnie

回答

0

你的問題不是特定於Angular,而是Javascript。當你將對象值傳遞給不同的變量時,你不會傳遞實際的對象值,而只是對對象的引用。所以對象值本身只存在於內存中的一個地方,每個變量都包含對該位置的引用。

本博客文章進一步解釋:http://nsono.net/javascript-pass-by-value-or-pass-by-reference/

由於其他意見已經解釋採用了棱角分明的複製功能,將導致創建並存儲在內存和解決您的問題一個全新的對象。

有克隆對象的各種非角的方式爲好,這裏是一些描述:http://heyjavascript.com/4-creative-ways-to-clone-objects/

也許最簡潔:JSON.parse(JSON.stringify(myObject))