我参加了一次有角度的演讲,会议中提到的一位人ng-bind
比{{}}
绑定更好。
一个原因,ng-bind
将变量放在观察列表中,只有当模型发生变化时才会推送数据以查看,另一方面,{{}}
每次都会插入表达式(我猜是角循环)并推送值,即使值改变与否。
也有人说,如果您在屏幕上没有太多数据,您可以使用{{}}
并且性能问题将不可见。有人可以为我解释一下这个问题吗?
我参加了一次有角度的演讲,会议中提到的一位人ng-bind
比{{}}
绑定更好。
一个原因,ng-bind
将变量放在观察列表中,只有当模型发生变化时才会推送数据以查看,另一方面,{{}}
每次都会插入表达式(我猜是角循环)并推送值,即使值改变与否。
也有人说,如果您在屏幕上没有太多数据,您可以使用{{}}
并且性能问题将不可见。有人可以为我解释一下这个问题吗?
能见度:
当您的 angularjs 正在引导时,用户可能会在 html 中看到您放置的括号。这可以用ng-cloak
. 但对我来说,这是一种解决方法,如果我使用ng-bind
.
表现:
{{}}
速度要慢得多。
这ng-bind
是一个指令,将在传递的变量上放置一个观察者。所以只有当传递的值确实改变ng-bind
时才会适用。
另一方面,即使没有必要,括号也会在每个中进行脏检查和刷新。 $digest
我目前正在构建一个大型单页应用程序(每个视图约 500 个绑定)。从 {{}} 更改为 strictng-bind
确实为我们节省了大约 20% 的scope.$digest
.
建议:
如果您使用诸如angular-translate之类的翻译模块,请始终在括号注释之前使用指令。
{{'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
输出表中的一些数据,每行有多个绑定。翻译绑定,过滤输出,在每个作用域摘要中执行。
如果您不使用ng-bind
,请改为:
<div>
Hello, {{user.name}}
</div>
您可能会在解决之前看到实际Hello, {{user.name}}
的一秒钟user.name
(在加载数据之前)
你可以做这样的事情
<div>
Hello, <span ng-bind="user.name"></span>
</div>
如果这对你来说是个问题。
另一种解决方案是使用ng-cloak
.
ng-bind
好于{{...}}
例如,您可以这样做:
<div>
Hello, {{variable}}
</div>
这意味着包含的整个文本Hello, {{variable}}
将<div>
被复制并存储在内存中。
相反,如果您执行以下操作:
<div>
Hello, <span ng-bind="variable"></span>
</div>
只有值的值将存储在内存中,并且 angular 将注册一个仅由变量组成的观察者(观察表达式)。
基本上,双花括号语法更自然地可读并且需要更少的输入。
两种情况都会产生相同的输出,但是.. 如果您选择使用,则用户有可能会在您的模板被 Angular 渲染之前{{}}
看到几毫秒。{{}}
因此,如果您注意到任何{{}}
那么最好使用ng-bind
.
同样非常重要的是,只有在您的角度应用程序的 index.html 中,您才能拥有 un-rendered {{}}
。如果您使用的是指令,那么模板,则没有机会看到这一点,因为角度首先渲染模板,然后将其附加到 DOM。
{{...}}
是指双向数据绑定。但是,ng-bind实际上是用于单向数据绑定。
使用ng-bind将减少页面中的观察者数量。因此ng-bind将比{{...}}
. 因此,如果您只想显示一个值及其更新,并且不想将其从 UI 的更改反映回控制器,那么请使用ng-bind。这将提高页面性能并减少页面加载时间。
<div>
Hello, <span ng-bind="variable"></span>
</div>
这是因为{{}}
角度编译器同时考虑了文本节点和它的父节点,因为有可能合并 2{{}}
个节点。因此,有额外的链接器会增加加载时间。当然,对于少数这样的情况,差异并不重要,但是当您在大量项目的转发器中使用它时,它会在较慢的运行时环境中产生影响。
ng-bind也有它的问题。当你尝试使用 angular filters,limit或其他东西时,如果你使用ng-bind ,你可能会遇到问题。但在其他情况下,ng-bind在UX方面更好。当用户打开页面时,他/她会看到(10ms-100ms)打印符号({{ ... }}),这就是为什么 ng-bind 更好.
{{ }} 中存在一些闪烁的问题,例如当您刷新页面时,会看到很短的垃圾邮件时间表达式。所以我们应该使用 ng-bind 而不是表达式来进行数据描述。
你可以参考这个网站,它会给你一个解释哪个更好,因为我知道 {{}} 这比 ng-bind 慢。
ng-bind
也更安全,因为它表示html
为字符串。
因此例如,'<script on*=maliciousCode()></script>'
将显示为字符串而不被执行。
根据 Angular Doc:
由于ngBind是一个元素属性,它使绑定在页面加载时对用户不可见......这是主要区别......
基本上直到每个dom元素都没有加载,我们看不到它们,因为ngBind是元素上的属性,它等到 dom 开始发挥作用......下面的更多信息
ngBind
- 模块 ng 中
的指令ngBind 属性告诉AngularJS将指定 HTML 元素的文本内容替换为给定表达式的值,并在该表达式的值更改时更新文本内容。
通常,您不直接使用 ngBind,而是使用类似于{{ expression }}的双卷曲标记,它类似但不那么冗长。
如果在 AngularJS 编译模板之前浏览器暂时以原始状态显示模板,则最好使用 ngBind 而不是 {{ expression }}。由于 ngBind 是一个元素属性,它使绑定在页面加载时对用户不可见。
这个问题的另一种解决方案是使用ngCloak指令。访问这里
有关ngbind的更多信息,请访问此页面:https ://docs.angularjs.org/api/ng/directive/ngBind
你可以做这样的事情作为属性,ng-bind:
<div ng-bind="my.name"></div>
或进行如下插值:
<div>{{my.name}}</div>
或者在 AngularJs 中使用 ng-cloak 属性:
<div id="my-name" ng-cloak>{{my.name}}</div>
ng-cloak 避免在 dom 上闪烁并等待一切准备就绪!这等于ng-bind属性...