2016-09-15 36 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))