AngularJS:为什么 ng-bind 在 angular 方面比 {{}} 更好?

IT技术 javascript angularjs ng-bind
2021-01-29 01:18:57

我在其中一个角度演示和会议中提到的人之一ng-bind{{}}绑定更好

一个原因,ng-bind将变量放在观察列表中,只有当模型发生变化时才会推送数据查看,另一方面,{{}}每次都会插入表达式(我猜是角度循环)并推送值,即使值改变或不改变。

也有人说,如果你在屏幕上的数据不多,你可以使用{{}},性能问题将不可见。有人可以为我解释一下这个问题吗?

6个回答

能见度:

当您的 angularjs 正在引导时,用户可能会在 html 中看到您放置的括号。这可以通过ng-cloak. 但对我来说,这是一种解决方法,如果我使用ng-bind.


表现:

{{}}慢得多

ng-bind是一个指令,将在传递的变量上放置一个观察者。所以ng-bind只有当传递的值确实改变时才适用

另一方面,括号将每个 中进行脏检查和刷新,即使它不是必需的 $digest


我目前正在构建一个大型单页应用程序(每个视图约 500 个绑定)。从 {{}} 更改为严格ng-bind确实为我们节省了大约 20% 的scope.$digest.


建议

如果您使用诸如angular-translate 之类的翻译module,请始终在括号注释之前使用指令

{{'WELCOME'|translate}} => <span ng-translate="WELCOME"></span>

如果您需要过滤器功能,最好选择一个指令,它实际上只使用您的自定义过滤器。 $filter 服务的文档


28.11.2014 更新(但可能偏离主题):

在 Angular 1.3xbindonce中引入了该功能。因此,您可以绑定一次表达式/属性的值(将在 != 'undefined' 时绑定)。

当您不希望绑定更改时,这很有用。

用法: 放置::在绑定之前:

<ul>  
  <li ng-repeat="item in ::items">{{item}}</li>
</ul>  
<a-directive name="::item">
<span data-ng-bind="::value"></span>

例子:

ng-repeat输出表中的一些数据,每行有多个绑定。翻译绑定,过滤输出,在每个范围摘要中执行。

从我可以从源(截至 2014 年 11 月 24 日)得知,curl插值的处理就像指令一样(参见 ng/compile.js 中的 addTextInterpolateDirective())。它还使用 $watch 所以如果文本没有改变,DOM 不会被触及,它不会像你声称的那样在每个 $digest 上“脏检查和刷新”它。但是,对每个 $digest 所做的是计算插入的结果字符串。除非它发生变化,否则它不会分配给文本节点。
2021-03-15 01:18:57
我写了一个内部评估的性能测试。它在 ng 重复中有 2000 个条目,并在对象中显示 2 个属性,因此是 2000x2 绑定。绑定的不同之处在于:第一个绑定只是跨度中的绑定。秒有一个绑定和一些简单的 html。结果:ng-bind 比每个范围应用快约 20%。在不检查代码的情况下,在 html 元素中使用curl表达式的额外纯 html 似乎需要更多时间。
2021-03-22 01:18:57
因为你没有提供任何来源,我给你一个:ng-perf.com/2014/10/30/... “ng-bind 更快,因为它更简单。插值必须经过额外的步骤来验证上下文,jsonification值等等。这使它稍微慢一些。”
2021-03-30 01:18:57
这是一个更好的答案
2021-04-03 01:18:57
只是想指出,根据这里的测试:jsperf.com/angular-bind-vs-brackets似乎表明括号比绑定更快。(注意:条是每秒操作数,因此越长越好)。正如之前的评论所指出的,他们的观察机制最终是相同的。
2021-04-03 01:18:57

如果您不使用ng-bind,而是使用以下内容:

<div>
  Hello, {{user.name}}
</div>

您可能会Hello, {{user.name}}user.name解析之前看到实际一秒钟(在加载数据之前)

你可以做这样的事情

<div>
  Hello, <span ng-bind="user.name"></span>
</div>

如果这对你来说是个问题。

另一种解决方案是使用ng-cloak.

@Victor 还有ng-bind-template你可以结合这两种方法的地方:ng-bind-template="Hello, {{user.name}}"这里绑定仍然提供性能提升并且不会引入任何进一步的嵌套
2021-03-11 01:18:57
对我来说,这不是问题的答案,为什么 ngBind 更好。这只是如何使用 ngBind 而不是 {{}} 注释和对 ngCloak 的引用。
2021-03-25 01:18:57
根据您的说法,如果我们使用 {{}}? 有人告诉我,如果您每次都使用 {{}},即使模型没有改变,也会进行插值并生成结果。
2021-04-03 01:18:57
@KevinMeredith 在 HTML 加载时看起来是这样,但 angular 还没有(还)。请记住,我们正在谈论的是客户端模板。所有的插值都必须在加载应用程序的浏览器中完成。通常角度加载足够快以至于不会被注意到,但在某些情况下它会成为一个问题。所以,ng-cloak被发明来解决这个问题。
2021-04-07 01:18:57
如果我不想将 user.name 包裹在 span 标签中,如何使用 ng-bind?如果我使用大括号,我会得到干净的名字,没有 html 标签
2021-04-09 01:18:57

ng-bind{{...}}

例如,你可以这样做:

<div>
  Hello, {{variable}}
</div>

这意味着Hello, {{variable}}由 包围的整个文本<div>将被复制并存储在内存中。

如果你做这样的事情:

<div>
  Hello, <span ng-bind="variable"></span>
</div>

只有值的值会存储在内存中,angular 会注册一个仅由变量组成的观察者(观察表达式)。

另一方面,您的 DOM 更深。根据您在做什么,在大文档中这可能会影响渲染性能。
2021-03-22 01:18:57
<div ng-bind-template="{{ var1 }}, {{ var2}}"></div> 是 {{ }} 和 ng-bind 等功能的替代品
2021-03-26 01:18:57
是的,我认为@stephband 也是如此。例如,如果您只想显示姓名和姓氏。为什么不只是插值?它将以相同的方式执行,因为它将在 1 个摘要中运行相同的监视。如:<div>{{firstName}} {{lastName}}</div> == <div><span ng-bind="firstName"></span> <span ng-bind="lastName"></ span></div> .. 第一个看起来更好。我认为这在很大程度上取决于您想要什么,但最终它们都有优点和缺点。
2021-03-27 01:18:57
这不是苹果对苹果——你是在一个中引入一个 span 元素,而不是另一个。与 的示例ng-bind更具有可比性<div>Hello, <span>{{variable}}</span></div>
2021-04-01 01:18:57

基本上双curl语法更自然可读并且需要更少的输入。

两种情况都会产生相同的输出,但是.. 如果您选择使用{{}},则用户可能会{{}}在 angular 渲染模板之前看到几毫秒因此,如果您注意到任何,{{}}则最好使用ng-bind.

同样非常重要的是,只有在你的 angular 应用程序的 index.html 中,你才能有 un-rendered {{}}如果您使用指令那么模板,则没有机会看到这一点,因为 angular 首先渲染模板,然后将其附加到 DOM。

有趣的是,它不一样。我在 ng-bind="anArrayViaFactory" 与 {{anArrayViaFactory}} 上没有任何输出。我在尝试在 jekyll 原型中输出 json 响应时遇到了这个问题,但由于与类似模板 {{}} 的冲突,我被迫使用 ng-bind。ng-repeat 块(anArrayViaFactory 中的项目)内的 ng-bind 将输出值。
2021-03-15 01:18:57

{{...}}是指双向数据绑定。但是,ng-bind实际上是用于单向数据绑定。

使用ng-bind将减少页面中的观察者数量。因此ng-bind将比{{...}}. 因此,如果您只想显示一个值及其更新,并且不想将其从 UI 的更改反映回控制器,那么请选择ng-bind这将提高页面性能并减少页面加载时间。

<div>
  Hello, <span ng-bind="variable"></span>
</div>