在AngularJS中,将一个变量初始化为另一个变量,而不会在以后对前者的修改影响后者
Initializing variable as equal to another without having future changes to the former affect the latter in AngularJS
我知道,当涉及到HTML中显示的变量时,人们大多会提到双向绑定,但我一直遇到同样的问题,并意识到我不理解Angular的一些基本问题。
为了回答这个问题,我目前正在开发一款RPG浏览器游戏。我希望每个字符都有basestat,表示为:'baseStats' : {
'defense' : 5,
'strength' : 3,
'speed' : 7
}
但是在战斗过程中,它们可能会被"buff"或"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;
});
}
这显然更具可读性和简洁,但不幸的是,如果我做了改变。从应用程序的其他地方获取的,这些更改也会影响basestat。我很困惑为什么会这样,因为它们看起来实际上是相同的东西。
你的问题不是针对Angular的,而是针对Javascript的。当你将对象值传递给不同的变量时,你并没有传递实际的对象值,而只是传递对对象的引用。因此,对象值本身只存在于内存中的一个位置,每个变量都包含对该位置的引用。
这篇博文进一步解释:http://nsono.net/javascript-pass-by-value-or-pass-by-reference/
正如其他的注释所解释的那样,使用Angular的copy函数会导致一个全新的对象被创建并存储在内存中,从而解决你的问题。
也有各种非angular克隆对象的方法,其中一些在这里描述:http://heyjavascript.com/4-creative-ways-to-clone-objects/
可能是最简洁的:JSON.parse(JSON.stringify(myObject))
相关文章:
- 为什么全局变量没有't似乎受到内部作用域(Javascript)的影响
- 将PHP变量发送到Javascript而不影响“;查看来源”;
- 为什么后递增/递减运算符对循环中的变量没有任何影响
- 影响其他变量的 Tumblr 喜欢按钮
- JavaScript 基础知识:变量受对不同变量执行的方法的影响
- js更改变量会影响到原始变量
- 影响循环内闭合函数中变量的闭包
- 如何在不影响AngularJS中原始变量的情况下操作视图值
- 在javascript变量中保存密码-安全性影响
- 在JavaScript中更改局部变量会影响具有不同名称的原始全局变量
- 我的 IF 条件如何影响全局变量使函数循环
- 使用局部变量(而不是重复的属性访问)是否会影响性能
- 可以jQuery's.animate()方法可以影响变量,而不是CSS属性
- 存储这样的全局变量有什么影响吗
- 将值存储在两个变量中并更改其中一个会影响Javascript中的两个变量
- 为什么cheerio $变量不影响其他会话?
- 在不影响另一个页面的情况下更改一个页面的变量
- 在全局作用域中不受其影响的函数中传递的全局变量
- 变量影响或 IF 语句 IE 问题
- QtScript中变量影响问题