为什么更改范围获胜'不能在ng if内部工作,而是通过函数调用AngularJS

Why changing a scope won't work inside a ng-if but via function call - AngularJS

本文关键字:工作 内部 AngularJS 函数调用 if ng 获胜 范围 不能 为什么      更新时间:2023-09-26

以下是我在其中切换hideQA值的代码片段,该值在这两种情况下都会正确更改,但如果我正在执行-,则不会正确隐藏div

`<button ng-click="hideQA = !hideQA">Reset</button>`

但是,如果我改变一个方法的值,比如-,它是正确的

`<button ng-click="resetForm()">Reset</button>`

有人能解释一下背后的原因吗?

工作Plnkr-http://plnkr.co/edit/rIAAcibX2Ts1VaMWKQtc?p=preview

ng-if有自己的$scope,当元素被移除时,$scope也会被移除。因此,您必须使用$parent 参考父作用域

<button ng-click="$parent.hideQA = !hideQA">Reset</button>

另一种选择是使用ng-show

<div class="message" ng-show="hideQA !== false">
    This is div two !!!
    <button ng-click="hideQA = !hideQA">Reset</button>
</div>

这是因为范围之间的确定性限制。

为了对此没有问题,您必须使用点表示法。

参见plunkr:http://plnkr.co/edit/ES9qTl7nsmGGOJnE0H8u?p=preview

有关点标记的更多解释,请参阅文章

以下是您的点符号代码:

<button ng-click="a.hideQA = !a.hideQA">Reset</button>
$scope.a = {hideQA:false};
$scope.a.hideQA = true;

上面给出的答案已经解决了这个问题。这是我的工作plunkr链接:http://plnkr.co/edit/ZdL441bBmQToGZn4gfQt?p=preview.我要说的是:

当你使用ng-if时,它会创建自己的范围,来自angularjs官方文档:

在ngIf中创建的作用域使用原型继承从其父作用域继承。

简而言之,当引用其父作用域中的值时,只复制主类型(如stringintegerboolean等)的值,而不复制值的引用(或pointer)。这意味着它是单向引用,而不是双向引用。因此,为了使用双向,最佳实践是始终使用javascript object {attr: value}。因此推荐使用.

这是一篇关于作用域的非常好的文章,值得20分钟的准备https://github.com/angular/angular.js/wiki/Understanding-Scopes

希望这能帮助你:)