鉴于此测试案例使用AngularJS 1.2 rc3:http://plnkr.co/edit/MX6otx(下面重复)
1
<li ng-init="toggle1 = false">
ng-if toggle1: {{ toggle1 }}
<p>
<button ng-if="!toggle1" ng-click="toggle1 = true">Turn On</button>
<button ng-if="toggle1" ng-click="toggle1 = false">Turn Off</button>
does not work
</li>
2
<li ng-init="obj={toggle2:false}">
ng-if obj.toggle2: {{ obj.toggle2 }}
<p>
<button ng-if="!obj.toggle2" ng-click="obj.toggle2 = true">Turn On</button>
<button ng-if="obj.toggle2" ng-click="obj.toggle2 = false">Turn Off</button>
then why does this work?
</li>
问题:
答案 0 :(得分:29)
此范围继承机制在https://github.com/angular/angular.js/wiki/Understanding-Scopes
中得到了很好的解释答案 1 :(得分:5)
由于ngIf
创建了自己的范围,为了使其工作,您可以在一个范围内定义toggle1
:
JS **
$scope.toggleMe = function(){
$scope.toggle1 = !$scope.toggle1;
}
HTML 的
<li ng-init="toggle1 = true">
ng-if toggle1: {{ toggle1 }}
<p>
<button ng-if="toggle1" ng-click="toggleMe()">Turn On</button>
<button ng-if="!toggle1" ng-click="toggleMe()">Turn Off</button>
does not work
</li>
参见演示 Plunker
答案 2 :(得分:4)
1。为什么1不起作用?
ng-if
创建了一个新范围。这导致了“奇怪的”绑定行为,如本视频中所述:http://egghead.io/lessons/angularjs-the-dot
2。 1应该有效吗?
从父作用域读取属性(原型链),但写入作用域会在子作用域上创建一个新属性。创建一个断开连接的
3。 2为什么有效?
从父作用域(obj)读取相同的属性。写入ng-click会更改“obj”对象,而不是范围。
4/5。 2应该工作吗?我可以依赖2来处理AngularJS的未来更新吗?
是,这是记录的预期行为。
提示强> 我使用Chrome扩展程序AngularJS Batarang来深入了解哪个变量位于哪个范围内。