如果我有一个看法:
<div ng-repeat="foo in foos"> <p ng-if="bar">omg lol</p> <p ng-if="!bar">lol omg</p> </div>
我实际上是创造(2 * foos.length)1 $$观察者,这真的不好.我已经在线发现了几个来源,说你可以做ng-if =“:: bar”,但是当我这样做时观察者的数量不会改变.有没有办法强制 – 如果是一次绑定?
真的很笨,不得不做:
<div ng-repeat="foo in foos" ng-if="bar"> <p>omg lol</p> </div> <div ng-repeat="foo in foos" ng-if="!bar"> <p>lol omg</p> </div>
我相信会给我一些像4 $$观察者的东西…所以我正在寻找一种替代方案,以避免这样的愚蠢.
只是延长我的意见回答.
Angular 1.3一次绑定语法(:):的确会删除不必要的手表.只是在设置相关数据后,您需要测量一次手表.这就是为什么.当您在视图中设置一次性绑定属性时,角度将在其上设置一个临时手表,直到它获得一个定义的值,即除了未定义的值之外.这种方法是出于某种原因 – 为了支持通过延迟操作(如ajax调用,超时,承诺链解析等)填充的绑定值.没有这个::将不能成功地在任何东西,但预先填充的绑定值.
所以只要确保在某个时间点设置一些值到一次绑定值.不要让它保持不确定.
假设你有条件< divng-if =“:: lol”>< / div>重复100次.只要确保将值绑定到中继器或某些确定lol状态的操作即使该操作失败(例如ajax调用错误)仍然设置一个值(甚至为null也是JavaScript中的一个值).在即将到来的消息循环之后,手表将被移除,这个循环会使相应的DOM绑定.
在你的特定商店里,你也可以这样做:
<ul ng-repeat="item in items" ng-if="::lol"> <li>{{ ::item }}</li> </ul>
代替
<ul ng-repeat="item in items"> <li ng-if="::lol">{{ ::item }}</li> </ul>