我知道人们在HTML中显示的变量时大多指的是双向绑定,但我仍然遇到同样的问题,并意识到Angular有一些基本的东西,我不理解。
要设置此问题,我目前正在开发一款RPG浏览器游戏。我希望每个角色都有baseStats,表示为:
'baseStats' : {
'defense' : 5,
'strength' : 3,
'speed' : 7
}
但在战斗过程中,他们可能会被“缓冲”或“减弱”,所以我希望能够在不永久改变角色统计数据的情况下跟踪这些变化,因此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 :(得分:0)
你的问题并不是特定于Angular,而是一般的Javascript。将对象值传递给不同的变量时,您不会传递实际的对象值,而只是传递对象。因此,对象值本身仅存在于内存中的一个位置,并且每个变量都包含对该位置的引用。
此博客文章进一步解释:http://nsono.net/javascript-pass-by-value-or-pass-by-reference/
正如其他评论已经解释的那样,使用Angular的复制功能将导致创建一个完整的新对象并将其存储在内存中并解决您的问题。
还有各种非Angular克隆对象的方法,其中一些描述如下:http://heyjavascript.com/4-creative-ways-to-clone-objects/
可能最简洁:JSON.parse(JSON.stringify(myObject))