【问题标题】:one-time binding with ng-if in angular?与 ng-if 以角度方式一次性绑定?
【发布时间】:2015-06-17 23:33:36
【问题描述】:

如果我有这样的看法:

<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 $$watchers,这真的不好。我在网上找到了几个来源说你可以做 ng-if="::bar",但是当我这样做时,观察者的数量并没有改变。有没有办法强制 ng-if 成为一次性绑定?

不得不这样做真的很愚蠢:

<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 个 $$watchers 之类的东西......所以我正在寻找一种替代方法,以避免不得不像那样愚蠢。

【问题讨论】:

  • :: 是一次性绑定。只是它最初会创建一个临时监视,然后在将值分配给绑定属性后将其删除。你有证据吗?
  • 是的,这是一个 plunker,显示在 dom 渲染 2 秒后,$$watcher 计数为 2000,仅来自 ng-if...plnkr.co/edit/JgP3lRyuSoSPQNIgR8Ri?p=preview
  • 我看到的是 &lt;li ng-if="::lol"&gt;{{ ::item }}&lt;/li&gt; 观察者计数 ==> 2 without prefixing lol with :: it is 1002。你说什么?
  • 完全糊涂了……什么?所以你是说在浏览器超时后弹出警报窗口显示 2 个观察者?
  • 我很抱歉,我以为我用 ::lol 保存了版本,而不仅仅是 lol。好吧,这很奇怪,因为这不是我在应用程序中遇到的行为,我的 ng-if 中的 :: 前缀完全没有做任何事情,而我的观察者人数有数千人,所以我认为我需要进一步调查。

标签: angularjs


【解决方案1】:

只是扩展我的 cmets 来回答。

Angular 1.3 一次性绑定语法 (::) 确实会删除不必要的监视。只是你需要在设置相关数据后测量手表一段时间。这就是为什么。当您在视图上设置一次性绑定属性时,angular 将在其上设置一个临时监视,直到它获得 defined 值,即除undefined 之外的任何值。这种方法是有原因的 - 为了支持通过延迟操作(如 ajax 调用、超时、承诺链解析等)填充的绑定值。没有这个 :: 将无法在任何东西上成功运行,但预先填充的绑定价值观。

因此,请确保您在某个时间点将某个值设置为一次性绑定值。不要让它保持未定义。

当你有一个条件 &lt;div ng-if="::lol"&gt;&lt;/div&gt; 重复 100 次时说。只要确保当您将值绑定到转发器或确定lol 状态的某些操作时,即使该操作失败(比如ajax 调用错误)仍然设置一个值(即使null 也是javascript 中的一个值)给它。在呈现相应 DOM 绑定的即将到来的摘要周期之后,将删除监视。

在您的特定 plunker 中,您也可以这样做:

<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>

【讨论】:

    【解决方案2】:

    您需要使用 Bindence 来执行此操作:https://github.com/Pasvaz/bindonce

    【讨论】:

    • 自 Angularjs 1.3 以来没有原生支持使用 :: 语法的一次性绑定
    • @mxa055 你读过我的问题吗? ng-if="::foo" 什么都不做。它仍然创造了无数的观察者。
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多