AngularJS: ngInclude vs chỉ thị


93

Tôi không hiểu rõ khi nào nên sử dụng một chỉ thị và khi nào thì thích hợp hơn để sử dụng nginclude. Lấy ví dụ này: Tôi có một phần password-and-confirm-input-fields.html, đó là html để nhập và xác nhận mật khẩu. Tôi sử dụng điều này cả trong trang đăng ký và trong trang thay đổi mật khẩu. Hai trang đó đều có bộ điều khiển, mỗi trang html không có bộ điều khiển chuyên dụng.

Tôi nên sử dụng chỉ thị hay ngIncludecho điều này?


Tôi luôn luôn có một chỉ thị, nhưng tôi tò mò những người Angular có kinh nghiệm hơn sẽ nói gì.
Austin Mullins

1
Nếu nó thực sự là một thành phần độc lập, nó có thể phải có bộ điều khiển riêng được liên kết với nó. IMO, tôi muốn sử dụng một phần - nhưng, tôi tò mò đối với một số đầu vào hơn
tymeJV

4
Nếu có bất kỳ mã js nào cần thiết cho phần đó, hãy sử dụng một chỉ thị. Nếu nó chỉ là HTML, hãy sử dụng ngInclude.
Daniel Beck

Câu trả lời:


122

Tất cả phụ thuộc vào những gì bạn muốn từ đoạn mã của mình. Cá nhân tôi, nếu mã không có bất kỳ logic nào, hoặc thậm chí không cần bộ điều khiển, thì tôi sẽ sử dụng ngInclude. Tôi thường đặt nhiều đoạn html "tĩnh" lớn hơn mà tôi không muốn làm lộn xộn chế độ xem ở đây. (ví dụ: Giả sử một bảng lớn có dữ liệu đến từ Bộ điều khiển mẹ. Sẽ sạch <div ng-include="bigtable.html" />hơn tất cả những dòng đó làm lộn xộn Chế độ xem)

Nếu có logic, thao tác DOM hoặc bạn cần nó có thể tùy chỉnh (hay còn gọi là hiển thị khác nhau) trong các trường hợp khác nhau mà nó được sử dụng, thì directiveslựa chọn tốt hơn (lúc đầu chúng hơi nản, nhưng chúng rất mạnh, hãy cho nó thời gian) .

ngInclude

Đôi khi bạn sẽ thấy ngInclude'srằng bị ảnh hưởng bởi bên ngoài của chúng $scope/ interface. Chẳng hạn như một bộ lặp lớn / phức tạp cho phép nói. 2 giao diện này được gắn với nhau vì điều này. Nếu điều gì đó trong phần chính $scopethay đổi, bạn phải thay đổi / thay đổi logic của mình trong phần được bao gồm của bạn.

Chỉ thị

Mặt khác, các chỉ thị có thể có phạm vi / bộ điều khiển rõ ràng / v.v. Vì vậy, nếu bạn đang nghĩ đến một tình huống mà bạn phải sử dụng lại thứ gì đó nhiều lần, bạn có thể thấy việc kết nối phạm vi riêng của nó sẽ giúp cuộc sống dễ dàng hơn và ít hơn gây nhầm lẫn.

Ngoài ra, bất cứ khi nào bạn định tương tác với DOM, bạn nên sử dụng một chỉ thị. Điều này làm cho nó tốt hơn cho việc kiểm tra và tách các hành động này khỏi bộ điều khiển / dịch vụ / v.v., đó là điều bạn muốn!

Mẹo: Đảm bảo không sử dụng hạn chế: 'E' nếu bạn quan tâm đến IE8! Có nhiều cách để giải quyết vấn đề này, nhưng chúng gây khó chịu. Chỉ cần làm cho cuộc sống dễ dàng hơn và gắn bó với thuộc tính / etc.<div my-directive />

Thành phần [Cập nhật 3/1/2016]

Được thêm vào Angular 1.5, về cơ bản nó là một trình bao bọc xung quanh .directve(). Thành phần nên được sử dụng hầu hết thời gian. Nó loại bỏ rất nhiều mã chỉ thị soạn sẵn, bằng cách đặt mặc định những thứ như restrict: 'E', scope : {}, bindToController: true. Tôi thực sự khuyên bạn nên sử dụng những thứ này cho hầu hết mọi thứ trong ứng dụng của bạn, để có thể chuyển đổi sang Angular2 dễ dàng hơn.

Tóm lại là:

Bạn nên tạo các Thành phần & Chỉ thị phần lớn thời gian.

  • Có thể mở rộng hơn
  • Bạn có thể tạo mẫu và có tệp của mình bên ngoài (như ngInclude)
  • Bạn có thể chọn sử dụng phạm vi chính hoặc phạm vi cô lập riêng trong chỉ thị.
  • Tái sử dụng tốt hơn trong suốt ứng dụng của bạn


Cập nhật 3/1/2016

Bây giờ Angular 2 đang dần kết thúc và chúng tôi biết định dạng chung (tất nhiên vẫn sẽ có một số thay đổi ở đây và ở đó) chỉ muốn thêm nó quan trọng như thế nào để thực hiện components(đôi khi chỉ thị nếu bạn cần chúng bị hạn chế: ' E 'chẳng hạn).

Các thành phần rất giống với Angular 2 @Component. Bằng cách này, chúng ta đang đóng gói logic & html trong cùng một khu vực.


Hãy chắc chắn rằng bạn đóng gói nhiều thứ nhất có thể trong các thành phần, nó sẽ giúp quá trình chuyển đổi sang Angular 2 dễ dàng hơn nhiều! (Nếu bạn chọn thực hiện chuyển đổi)

Đây là một bài viết hay mô tả quá trình di chuyển này bằng cách sử dụng directives(tất nhiên rất giống nếu bạn định sử dụng các thành phần): http://angular-tips.com/blog/2015/09/migrating-directives-to-angular-2/


5
Tôi đồng ý với câu trả lời này. Đường cong học tập cho các chỉ thị rất dốc, nhưng nó thực sự thành công khi bạn nắm được nó.
Jazzy

@mcpDESIGNS, một trường hợp có lẽ không hoàn toàn phù hợp với câu trả lời này (ít nhất không phải là hai đoạn đầu tiên). Nếu tôi có điều hướng một phần, với bộ điều khiển riêng và tôi sẽ chỉ sử dụng điều này một lần (trong index.html-file), thì điều này có lẽ phải là một phần chứ không phải là một chỉ thị vì nó chỉ được sử dụng một lần (nó là một loại ứng dụng riêng biệt theo nghĩa là nó không được bao gồm như một phần của ngview), ngay cả khi nó có logic riêng. Hoặc là?
EricC

Điều này vẫn còn gây nhầm lẫn .. bạn cũng có thể chỉ định bộ điều khiển khi sử dụng ngInclude, hãy xem phần này: stackoverflow.com/questions/13811948/…
Marwen Trabelsi,

1
Tất nhiên, nhưng nó luôn được kết nối hoàn toàn với bộ điều khiển mẹ theo một cách nào đó. Nơi mà một chỉ thị có thể tạo một bộ điều khiển bên trong chính nó khi mẫu được tải. Nó có thể được hoàn toàn tách biệt (nếu bạn muốn)
Đánh dấu Pieszak - Trilon.io

1
Điều tốt nhất bạn có thể làm là trừu tượng hóa khái niệm này thành một nhà máy hoặc một cái gì đó, theo cách đó bạn có thể gọi nó từ bên trong một linkhàm và thì đấy! Nó sẽ được tốt đẹp của nướng vào chỉ thị tuy nhiên, không nghi ngờ gì nữa :( @Arwin
Đánh dấu Pieszak - Trilon.io
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.