我刚刚发现 Angular 表达式中允许的内容存在这种有趣的明显不一致:
- 可以在表达式中执行赋值
- 如果赋值涉及 ngRepeat 中的局部变量,则会中断
- 这可以通过使用控制器中定义的 setter 而不是表达式中的赋值来克服
参见普朗克 http://plnkr.co/edit/Lt57nqfm3TH7XdFa5xML?p=preview
The 关于表达式的文档 http://docs.angularjs.org/guide/expression似乎只是明确禁止表达式中的控制流,并且我没有看到任何提及上述行为的内容。
我想从中得出的结论是,无论如何使用 setter 可能是更好的设计模式,但是有人知道关于表达式中可能的内容的更明确的参考吗?
如果 Angular 单方面禁止对它们进行赋值,也许会更好。 (一个相关的不一致是,似乎可以在 i = i+1 的表达式中递增,但 i+=1 则不行...)
这是指令范围的一个已知问题。你可以阅读这篇文章范围原型继承的细微差别 https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance了解更多关于scoping
在角度js中。
来自子/嵌入范围的任何原始值分配都将创建一个新的实例值,而不是更改父范围值
在您的情况下,您正在使用原始值selectedNumber
.
有两种建议的方法可以修复它
解决方案1
使用对象而不是原始值。
- 将 selectedNumber 更改为对象
scope.selectedNumber = { num : 1 };
- 将显示更改为
<h2>{{ selectedNumber.num }}</h2>
- 更改点击处理程序
ng-repeat
to ng-click="selectedNumber.num = number"
Demo: Plunker http://plnkr.co/edit/TxPD9lKFI9T4S5uZ4i07?p=preview
解决方案2:
Use $parent
范围参考
- 更改点击处理程序
ng-repeat
to ng-click="$parent.selectedNumber = number"
Demo: Plunker http://plnkr.co/edit/e6ncIbHiKRz6rX94XlXh?p=preview
解决方案3:
在父作用域中使用 setter
- 在父作用域中创建一个 setter 方法,例如
$scope.setSelectedNumber = function(num){ $scope.selectedNumber = num}
- 将点击事件更改为
setSelectedNumber(number)
(这是已经用过的方法)
Update:
正如 Anders Ekdahl 所建议的,建议使用基于对象(解决方案 1)的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)