AngularJS: Tại sao ng-bind tốt hơn {{}} trong góc?


401

Tôi đã ở trong một trong những bài thuyết trình góc cạnh và một trong những người trong cuộc họp đã đề cập ng-bind là tốt hơn so với {{}}ràng buộc.

Một trong những lý do, ng-bind đặt biến trong danh sách theo dõi và chỉ khi có mô hình thay đổi, dữ liệu sẽ được đẩy để xem, mặt khác, {{}}sẽ nội suy biểu thức mỗi lần (tôi đoán đó là chu kỳ góc) và đẩy giá trị, ngay cả khi giá trị thay đổi hay không.

Ngoài ra, người ta nói rằng, nếu bạn không có nhiều dữ liệu trên màn hình, bạn có thể sử dụng {{}}và vấn đề về hiệu suất sẽ không hiển thị. Ai đó có thể làm sáng tỏ vấn đề này cho tôi?



3
Bạn có thể vui lòng kiểm tra, nếu câu trả lời của tôi là tốt hơn
Konstantin Krass

{{}} theo tôi là không thực tế, người xem sẽ thấy thẻ của bạn trước khi dữ liệu được tải hoàn toàn. Tôi tự hỏi nếu đội Angular sẽ khắc phục vấn đề này.
Jerry Lương

2
@Blazemonger: Bạn không thể chỉ bao gồm thuộc tính ng-cloak để ngăn các mẫu được hiển thị trong giây lát?
supershnee

Câu trả lời:


322

Nếu bạn không sử dụng ng-bind, thay vào đó là một cái gì đó như thế này:

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

bạn có thể thấy thực tế Hello, {{user.name}}trong một giây trước khi user.nameđược giải quyết (trước khi dữ liệu được tải)

Bạn có thể làm một cái gì đó như thế này

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

nếu đó là một vấn đề cho bạn.

Một giải pháp khác là sử dụng ng-cloak.


3
Dựa trên những gì bạn đang nói, không có hiệu suất đạt được nếu chúng tôi sử dụng {{}}? Tôi đã nói, nếu bạn sử dụng {{}}, mọi lúc, điều đó sẽ được inerpolate và tạo kết quả ngay cả khi mô hình không thay đổi.
Nair

4
Và làm thế nào để sử dụng ng-bind nếu tôi không muốn bọc user.name bên trong thẻ span? Nếu tôi sử dụng dấu ngoặc nhọn, tôi sẽ nhận được tên sạch, không có thẻ html
Victor

5
@KevinMeredith nó xuất hiện như thế khi HTML đã được tải, nhưng angular vẫn chưa (chưa). Hãy nhớ rằng đó là khuôn mẫu phía khách hàng mà chúng ta đang nói đến. Tất cả các phép nội suy phải được thực hiện trong trình duyệt tải ứng dụng. Thông thường tải góc đủ nhanh để nó không được chú ý, nhưng trong một số trường hợp, nó trở thành một vấn đề. Vì vậy, ng-cloakđã được phát minh để khắc phục vấn đề này.
nguyên tắc ba chiều

17
Đối với tôi, đây không phải là câu trả lời cho câu hỏi, tại sao ngBind lại tốt hơn. Đó chỉ là cách sử dụng ngBind thay vì chú thích {{}} và tham chiếu đến ngCloak.
Konstantin Krass

4
@Victor cũng có ng-bind-templatenơi bạn có thể kết hợp cả hai cách tiếp cận: ng-bind-template="Hello, {{user.name}}"Ở đây, ràng buộc vẫn cung cấp hiệu suất tăng và không giới thiệu bất kỳ lồng nào nữa
loay hoay

543

Hiển thị:

Trong khi angularjs của bạn đang bootstrapping, người dùng có thể thấy dấu ngoặc được đặt của bạn trong html. Điều này có thể được xử lý với ng-cloak. Nhưng đối với tôi đây là một cách giải quyết, mà tôi không cần sử dụng, nếu tôi sử dụng ng-bind.


Hiệu suất:

Các {{}}chậm hơn nhiều .

Đây ng-bindlà một chỉ thị và sẽ đặt một người theo dõi vào biến đã qua. Vì vậy, ý ng-bindchí chỉ áp dụng, khi giá trị được thông qua thực sự thay đổi .

Các dấu ngoặc trên Mặt khác sẽ được bẩn kiểm tra và làm mới trong mỗi $digest , ngay cả khi nó không cần thiết .


Tôi hiện đang xây dựng một ứng dụng trang lớn (~ 500 ràng buộc cho mỗi lượt xem). Thay đổi từ {{}} thành nghiêm ngặt ng-bindđã giúp chúng tôi tiết kiệm khoảng 20% ​​mỗi lần scope.$digest.


Gợi ý :

Nếu bạn sử dụng một mô-đun dịch thuật như dịch góc , luôn thích chỉ thị trước chú thích dấu ngoặc.

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

Nếu bạn cần một chức năng lọc, tốt hơn là chỉ thị, mà thực sự chỉ sử dụng bộ lọc tùy chỉnh của bạn. Tài liệu cho dịch vụ lọc $


CẬP NHẬT 28.11.2014 (nhưng có thể ngoài chủ đề):

Trong Angular 1.3x bindoncechức năng đã được giới thiệu. Do đó, bạn có thể liên kết giá trị của một biểu thức / thuộc tính một lần (sẽ bị ràng buộc khi! = 'Không xác định').

Điều này hữu ích khi bạn không mong muốn ràng buộc của mình thay đổi.

Cách sử dụng: Đặt ::trước ràng buộc của bạn:

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

Thí dụ:

ng-repeatđể xuất một số dữ liệu trong bảng, với nhiều ràng buộc mỗi hàng. Liên kết dịch thuật, đầu ra bộ lọc, được thực thi trong mọi bản tóm tắt phạm vi.


32
đây là một câu trả lời tốt hơn
NimChimpsky

13
Từ những gì tôi có thể nói từ nguồn (kể từ 2014-11-24), phép nội suy xoăn được xử lý giống như một lệnh (xem addTextInterpolateDirective () trong ng / compile.js). Nó cũng sử dụng $ watch để DOM không bị chạm nếu văn bản không thay đổi, nó không "kiểm tra bẩn và làm mới" nó trên mỗi $ digest như bạn yêu cầu. Điều được thực hiện trên mỗi $ digest là chuỗi kết quả được nội suy được tính toán. Nó chỉ không được gán cho nút văn bản trừ khi nó thay đổi.
Matti Virkkunen

6
Tôi đã viết một bài kiểm tra hiệu suất để đánh giá nội bộ. Nó có 2000 mục trong một lần lặp lại và hiển thị 2 thuộc tính trong đối tượng, vì vậy 2000x2 liên kết. Các ràng buộc khác nhau ở: Liên kết đầu tiên chỉ là ràng buộc trong một khoảng. Các giây có một ràng buộc và một số html đơn giản trong đó. Kết quả: ng-bind đã nhanh hơn khoảng 20% ​​cho mỗi phạm vi được áp dụng. Không có kiểm tra mã, có vẻ như, html đơn giản bổ sung với biểu thức xoăn trong phần tử html thậm chí còn mất nhiều thời gian hơn.
Konstantin Krass

2
Chỉ muốn chỉ ra rằng theo các thử nghiệm ở đây: jsperf.com/angular-bind-vs-brackets dường như cho thấy dấu ngoặc là NHANH CHÓNG hơn ràng buộc. (Lưu ý: các thanh là ops mỗi giây, do đó lâu hơn là tốt hơn). Và như những bình luận trước đây chỉ ra, cơ chế theo dõi của họ cuối cùng giống hệt nhau.
Warren

1
Vì bạn không cung cấp bất kỳ nguồn nào, tôi cung cấp cho bạn một nguồn: ng-perf.com/2014/10/30/ "" liên kết nhanh hơn vì nó đơn giản hơn. Nội suy phải trải qua các bước bổ sung để xác minh bối cảnh, jsonization của giá trị và nhiều hơn nữa. Điều đó làm cho nó chậm hơn một chút. "
Konstantin Krass

29

ng-bind tốt hơn {{...}}

Ví dụ: bạn có thể làm:

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

Điều này có nghĩa là toàn bộ văn bản Hello, {{variable}}kèm theo<div> sẽ được sao chép và lưu trữ trong bộ nhớ.

Nếu thay vào đó bạn làm một cái gì đó như thế này:

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

Chỉ giá trị của giá trị sẽ được lưu trữ trong bộ nhớ và angular sẽ đăng ký một trình theo dõi (biểu thức đồng hồ) chỉ bao gồm biến.


7
Mặt khác, DOM của bạn sâu hơn. Tùy thuộc vào những gì bạn đang làm, trong các tài liệu lớn, điều này có thể ảnh hưởng đến hiệu suất kết xuất.
stephband

2
Vâng, tôi nghĩ giống như cách @stephband làm. Nếu bạn chỉ muốn hiển thị tên và họ chẳng hạn. Tại sao không chỉ nội suy? Nó sẽ thực hiện theo cùng một cách vì nó sẽ chạy cùng một chiếc đồng hồ trong 1 digest. Giống như: <div> {{FirstName}} {{lastName}} </ div> == <div> <span ng-bind = "firstName"> </ span> <span ng-bind = "lastName"> </ span> </ div> .. Và cái đầu tiên có vẻ tốt hơn. Tôi nghĩ nó phụ thuộc rất nhiều vào những gì bạn muốn nhưng cuối cùng cả hai đều có ưu điểm và nhược điểm.
pgarciacamou

3
<div ng-bind-template="{{ var1 }}, {{ var2}}"></div>là một thay thế cho {{}} và các chức năng như ng-bind
southamerican

1
Đây không phải là táo với táo Bạn đang giới thiệu một yếu tố nhịp trong một, và không phải là một yếu tố khác. Ví dụ với ng-bindsẽ tương đương với <div>Hello, <span>{{variable}}</span></div>.
iconoclast

15

Về cơ bản cú pháp xoăn đôi dễ đọc hơn và yêu cầu gõ ít hơn.

Cả hai trường hợp đều tạo ra cùng một đầu ra nhưng .. nếu bạn chọn đi cùng, {{}}có khả năng người dùng sẽ thấy trong một vài mili giây {{}}trước khi mẫu của bạn được hiển thị bằng góc. Vì vậy, nếu bạn nhận thấy bất kỳ {{}}thì tốt hơn là sử dụngng-bind .

Ngoài ra, điều rất quan trọng là chỉ trong index.html của ứng dụng góc của bạn, bạn mới có thể hủy kết xuất {{}}. Nếu bạn đang sử dụng các lệnh như vậy thì các mẫu, sẽ không có cơ hội thấy điều đó bởi vì góc đầu tiên sẽ hiển thị mẫu và sau khi thêm nó vào DOM.


5
Thật thú vị, nó không giống nhau. Tôi không nhận được kết quả nào trên ng-bind = "anArrayViaFactory" so với {{anArrayViaFactory}}. Tôi đã gặp phải vấn đề này khi cố gắng đưa ra phản hồi json trong protoype jekyll nhưng vì mâu thuẫn với khuôn mẫu tương tự {{}}, tôi đã buộc phải sử dụng ng-bind. Một liên kết ng bên trong một khối lặp lại ng (mục trong anArrayViaFactory) sẽ xuất ra các giá trị.
eddywashere

5

{{...}}có nghĩa là ràng buộc dữ liệu hai chiều. Nhưng, ng-bind thực sự có nghĩa là liên kết dữ liệu một chiều.

Sử dụng ng-bind sẽ giảm số lượng người theo dõi trong trang của bạn. Do đó ng-bind sẽ nhanh hơn {{...}}. Vì vậy, nếu bạn chỉ muốn hiển thị một giá trị và các cập nhật của nó và không muốn phản ánh sự thay đổi của nó từ UI trở lại bộ điều khiển, thì hãy tìm ng-bind . Điều này sẽ tăng hiệu suất trang và giảm thời gian tải trang.

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

4

Điều này là do {{}}trình biên dịch góc xem xét cả nút văn bản và nó là cha mẹ vì có khả năng hợp nhất 2 {{}}nút. Do đó có các liên kết bổ sung thêm vào thời gian tải. Tất nhiên trong một vài lần như vậy, sự khác biệt là không quan trọng, tuy nhiên khi bạn sử dụng nó trong một bộ lặp lại số lượng lớn các mục, nó sẽ gây ra tác động trong môi trường thời gian chạy chậm hơn.


2

nhập mô tả hình ảnh ở đây

Lý do tại sao Ng-Bind tốt hơn bởi vì,

Khi Trang của bạn không được tải hoặc khi internet của bạn chậm hoặc khi trang web của bạn tải một nửa, thì bạn có thể thấy các loại sự cố này (Kiểm tra Ảnh chụp màn hình với dấu Đọc) sẽ được kích hoạt trên Màn hình hoàn toàn kỳ lạ. Để tránh như vậy, chúng ta nên sử dụng Ng-bind


1

ng-bind cũng có vấn đề của nó. Khi bạn cố gắng sử dụng các bộ lọc góc , giới hạn hoặc thứ gì khác, bạn có thể gặp vấn đề nếu bạn sử dụng ng-bind . Nhưng trong trường hợp khác, ng-bind tốt hơn ở phía UX. Khi người dùng mở một trang, anh ấy / cô ấy sẽ thấy (10ms-100ms) in các ký hiệu ( {{...}} ), đó là lý do tại sao ng-bind tốt hơn .


1

Có một số vấn đề nhấp nháy trong {{}} như khi bạn làm mới trang sau đó để thấy một biểu thức spam thời gian ngắn. Vì vậy, chúng ta nên sử dụng ng-bind thay vì biểu thức cho mô tả dữ liệu.


0

ng-bindcũng an toàn hơn vì nó đại diện htmlnhư một chuỗi.

Vì vậy, ví dụ, '<script on*=maliciousCode()></script>'sẽ được hiển thị dưới dạng một chuỗi và không được thực thi.


0

Theo Angular Doc:
ngBind là một thuộc tính thành phần, nó làm cho các ràng buộc trở nên vô hình với người dùng trong khi trang đang tải ... đó là sự khác biệt chính ...

Về cơ bản cho đến khi mọi phần tử dom không được tải, chúng ta không thể thấy chúng và vì ngBind là thuộc tính của phần tử, nó sẽ đợi cho đến khi các doms hoạt động ... thêm thông tin bên dưới

ngBind
- Chỉ trong mô-đun ng

Các ngBind thuộc tính nói AngularJS để thay thế cho nội dung văn bản của phần tử HTML được chỉ định với giá trị của một biểu thức nào đó, và để cập nhật các nội dung văn bản khi giá trị của những thay đổi biểu hiện.

Thông thường, bạn không sử dụng ngBind trực tiếp mà thay vào đó, bạn sử dụng đánh dấu xoăn đôi như {{biểu thức}} tương tự nhưng ít dài dòng hơn.

Nên sử dụng ngBind thay vì {{biểu thức}} nếu một mẫu được trình duyệt hiển thị trong giây lát ở trạng thái thô trước khi AngularJS biên dịch nó. Vì ngBind là một thuộc tính thành phần, nó làm cho các ràng buộc vô hình với người dùng trong khi trang đang tải.

Một giải pháp thay thế cho vấn đề này sẽ là sử dụng chỉ thị ngCloak . truy cập vào đây

để biết thêm thông tin về ngbind, hãy truy cập trang này: https://docs.angularjs.org/api/ng/directive/ngBind

Bạn có thể làm một cái gì đó như thế này như thuộc tính, ng-bind :

<div ng-bind="my.name"></div>

hoặc thực hiện phép nội suy như dưới đây:

<div>{{my.name}}</div>

hoặc theo cách này với các thuộc tính ng-cloak trong AngularJs:

<div id="my-name" ng-cloak>{{my.name}}</div>

ng-cloak tránh nhấp nháy trên dom và đợi cho đến khi tất cả đã sẵn sàng! điều này tương đương với thuộc tính ng-bind ...


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.