如果变量在使用它的块内被修改,则可以ng
Can ng-if variable be modified inside a block that is using it?
我觉得这个问题很奇怪。
基本上,我希望一个块存在于基于ng-if
条件的页面上。但当我试图修改所述块中的ng-if
时,它对任何其他元素都没有任何影响。
为什么会发生这种情况?
JSFiddle在这里,代码如下:
<div ng-controller="MyCtrl">
<div ng-init="shouldShow=false">
<div ng-if="!shouldShow">
<p>{{shouldShow}}</p>
<div>
<button ng-click="shouldShow=!shouldShow">Hide Section</button>
<button ng-if="!shouldShow">Should Disappear</button>
</div>
</div>
</div>
</div>
这是ng-if
子作用域的问题,也是您试图在子作用域中双向绑定基元的事实。
您应该始终尝试将作用域中的对象用作models
,以便充分利用原型继承的好处。
点击此处查看差异:
<div ng-controller="Ctrl">
<div >
<p>{{model.shouldShow}}</p>
<div ng-if="!model.shouldShow">
<button ng-click="model.shouldShow=!model.shouldShow">Hide Section</button>
<p>{{model.shouldShow}}</p>
</div>
</div>
</div>
JS-
function Ctrl($scope) {
$scope.model={shouldShow:false}
}
同时阅读ng-init
的文档。它不应用于任意变量。它的主要目的是在ng-repeat
中对变量进行混叠
DEMO
ng-if的文档解释了发生了什么:
请注意,当使用ngIf移除元素时,其作用域被破坏并且在元素被恢复时创建新的范围。范围在ngIf中创建的使用prototype从其父作用域继承遗产这一点的一个重要含义是,如果使用ngModel在ngIf中绑定到父级中定义的javascript基元范围在这种情况下,对子作用域将覆盖(隐藏)父作用域中的值。
简而言之:一旦在子作用域中修改了shouldShow
,它就会覆盖父作用域的shouldShow
(原型继承)。正如另一个答案所指出的,这可以通过共享对象wrapperObject.shouldShow
间接解决。除非在子作用域中为wrapperObject
指定新值,否则它将指向与父作用域相同的实例(因此包含shouldShow
的相同实例)。
相关文章:
- 重复修改ng内Angular Scope内的对象
- 如果变量在使用它的块内被修改,则可以ng
- 使ng-show/ng-hide与由Angular之外的外部源修改的localStorage一起工作
- Angular 1.3 中是否有更好的模式,可以在每次修改 ng-repeat 中的项目时调用函数
- AngularJS:在不修改ng模型的情况下获取选择标签
- 从视图中修改ng模型
- 从链接修改指令模板中的 ng-show
- 修改 ng 选项
- 无法修改ng repeat生成的文本框
- 通过orderBy和/或筛选器修改ng repeat时重置状态
- 修改范围变量时未调用Angular ng init
- 使用AngularJS指令、工厂和ng-repeat动态修改内容
- 为什么columnDefs在重新排序或隐藏在ng网格中后不进行修改
- 如何修改指令中ng-repeat创建的每个元素的作用域
- 当ng-click函数被触发时,修改$scope的值
- 修改Angular中的第一个ng-options文本
- 请根据其他事件修改ng-click的功能
- Angularjs在同一元素的指令中修改ng-model,并进行验证
- 在Angular指令中修改ng-repeat模型
- 修改ng-messages指令,使其只在字段为$dirty时显示