Chỉ thị AngularJS là gì?


181

Tôi đã dành khá nhiều thời gian để đọc qua tài liệu AngularJS và một số hướng dẫn, và tôi đã khá ngạc nhiên về việc tài liệu này không thể chấp nhận được.

Tôi có một câu hỏi đơn giản, có thể trả lời cũng có thể hữu ích cho những người khác đang tìm cách chọn AngularJS:

Chỉ thị AngularJS là gì?

Cần có một định nghĩa đơn giản, chính xác về một chỉ thị ở đâu đó, nhưng trang web AngularJS cung cấp các định nghĩa vô dụng đáng ngạc nhiên này:

Trên trang chủ :

Chỉ thị là một tính năng độc đáo và mạnh mẽ có sẵn trong AngularJS. Chỉ thị cho phép bạn phát minh ra cú pháp HTML mới, cụ thể cho ứng dụng của bạn.

Trong tài liệu dành cho nhà phát triển :

Chỉ thị là một cách để dạy các thủ thuật mới của HTML. Trong các chỉ thị biên dịch DOM được khớp với HTML và được thực thi. Điều này cho phép các chỉ thị đăng ký hành vi hoặc chuyển đổi DOM.

Và có một loạt các cuộc nói chuyện về các chỉ thị, trớ trêu thay, dường như cho rằng khán giả đã hiểu chúng là gì.

Bất cứ ai cũng có thể đưa ra, để tham khảo rõ ràng, một định nghĩa chính xác về những gì một chỉ thị là giải thích:

  1. Nó là gì (xem định nghĩa rõ ràng của jQuery làm ví dụ)
  2. Những vấn đề thực tế và tình huống nó dự định sẽ giải quyết
  3. Kiểu mẫu thiết kế mà nó thể hiện, hoặc cách khác, làm thế nào nó phù hợp với nhiệm vụ MVC / MVW có chủ đích của AngularJS.

2
Bạn đã cho tôi tại ... xem định nghĩa rõ ràng về jQuery là một ví dụ.
joshuamabina

Không chắc nó như thế nào vào năm 2012 trên Stack Overflow, nhưng tôi chỉ sửa đổi câu hỏi này và thêm thẻ Thẻ góc góc trực tiếp. Thông tin thẻ của nó thực sự cho một định nghĩa khá rõ ràng. Ngoài ra, tôi nhận thấy rằng tôi không thể tìm thấy trích dẫn thứ hai trong tài liệu dành cho nhà phát triển
dùng4642212

Câu trả lời:


142

Nó là gì (xem định nghĩa rõ ràng của jQuery làm ví dụ)?

Một chỉ thị về bản chất là một hàm rằng thực thi khi trình biên dịch kiễu góc tìm thấy nó trong DOM. Các hàm có thể làm hầu hết mọi thứ, đó là lý do tại sao tôi nghĩ khá khó để xác định lệnh là gì. Mỗi chỉ thị có một tên (như ng-repeat, tab, make-up-your-own) và mỗi chỉ thị xác định nơi nó có thể được sử dụng: phần tử, thuộc tính, lớp, trong một nhận xét.

Một chỉ thị thường chỉ có một (bưu điện) chức năng liên kết. Một lệnh phức tạp có thể có chức năng biên dịch, chức năng liên kết trước và chức năng sau liên kết.

Những vấn đề thực tế và tình huống là nó dự định để giải quyết?

Các chỉ thị mạnh mẽ nhất có thể làm là mở rộng HTML. Tiện ích mở rộng của bạn là Ngôn ngữ cụ thể miền (DSL) để xây dựng ứng dụng của bạn. Ví dụ: nếu ứng dụng của bạn chạy một trang web mua sắm trực tuyến, bạn có thể mở rộng HTML để có các "lệnh mua sắm", "phiếu giảm giá", "đặc biệt", v.v. - bất kỳ từ hoặc đối tượng hoặc khái niệm nào tự nhiên hơn để sử dụng trong " tên miền "mua sắm trực tuyến, thay vì" div "và" span "(như @WTK đã đề cập).

Các chỉ thị cũng có thể thành phần HTML - nhóm một nhóm HTML thành một số thành phần có thể sử dụng lại. Nếu bạn thấy mình sử dụng ng-include để lấy rất nhiều HTML, có lẽ đã đến lúc tái cấu trúc thành các chỉ thị.

Kiểu mẫu thiết kế nào mà nó thể hiện, hoặc cách khác, làm thế nào nó phù hợp với nhiệm vụ MVC / MVW có chủ đích của angularjs

Chỉ thị là nơi bạn thao tác DOM và bắt các sự kiện DOM. Đây là lý do tại sao các hàm biên dịch và liên kết của lệnh đều nhận được "phần tử" làm đối số. Bạn có thể

  • định nghĩa một loạt HTML (nghĩa là một mẫu) để thay thế chỉ thị
  • liên kết các sự kiện với yếu tố này (hoặc con của nó)
  • thêm / xóa một lớp
  • thay đổi giá trị văn bản ()
  • theo dõi các thay đổi đối với các thuộc tính được xác định trong cùng một phần tử (thực ra đó là các giá trị của các thuộc tính được theo dõi - đây là các thuộc tính phạm vi, do đó chỉ thị theo dõi "mô hình" để thay đổi)
  • Vân vân.


Trong HTML, chúng tôi có những thứ như <a href="...">, <img src="...">, <br>, <table><tr><th>. Làm thế nào bạn sẽ mô tả những gì a, href, img, src, br, bảng, tr và th là gì? Đó là những gì một chỉ thị là.


2
Đánh dấu, cảm ơn. Tôi nghĩ rằng điều này là rõ ràng và có lẽ là gần nhất với một câu trả lời chính xác. Tôi nghĩ rằng các chỉ thị luôn bị ràng buộc với các thẻ html phải không? Vì vậy, có lẽ chính xác hơn khi nói rằng một lệnh là một hàm được liên kết với thẻ HTML. Như vậy, nó cho phép ngôn ngữ HTML được mở rộng khai báo.
tohster

Chà, một lệnh có thể được sử dụng trong một bình luận, vì vậy không phải tất cả các lệnh đều phải được ràng buộc với một thẻ HTML. Ví dụ:<!-- directive: my-directive exp -->
Mark Rajcok

Đánh dấu, đó sẽ là sử dụng độc đáo của một chỉ thị? tức là các chỉ thị được sử dụng theo quy ước và có mục đích mở rộng HTML.
tohster

9
OK tôi có một sự hiểu biết tốt hơn bây giờ. Một cách để nghĩ về nó là: 1. DSL thường đại diện cho các cây cú pháp 2. DOM DOM là một cây cú pháp DSL nhưng nó là một cứng nhắc: các thẻ hầu hết được thiết kế và mục đích cứng nhắc và không thể mở rộng. 3. AngularJS và cơ chế chỉ thị cụ thể, làm cho HTML DOM linh hoạt hơn bằng cách cho phép các nhà phát triển xây dựng các nút cây tùy chỉnh. Các nút này có thể biểu thị các hành vi mới hoặc tập hợp các hành vi hiện có (cây con) 4. Do đó, các lệnh cho phép HTML DOM phát triển thành DSL tùy chỉnh
tohster

1
@MarkRajcok Tôi đang vật lộn với đoạn cuối của bạn. Là đồng bằng <div></div>là một chỉ thị? Bạn đã đồng ý. Nhưng không có trang trí nào ở đây (thông qua phần tử, lớp, nhận xét, thuộc tính). Mọi người ở đây đang nói rằng đây là những điểm đánh dấu lại cho một DOM DOM . Bạn có thể làm rõ ? (Tôi không nói về nguyên nhân mà bạn có thể tạo một chỉ thị cho một yếu tố đơn giản như <div>)
Royi Namir

11

Có lẽ một định nghĩa thực sự đơn giản và ban đầu cho các chỉ thị góc sẽ là

Các chỉ thị AngularJS (ng-directives) là các thuộc tính HTML có tiền tố ng (ng-model, ng-app, ng-repeat, ng-bind) được Angular sử dụng để mở rộng HTML. ( từ: Hướng dẫn góc cạnh của W3schools )

Một số ví dụ về điều này sẽ là

Lệnh ng-app định nghĩa một ứng dụng AngularJS.

Lệnh ng-model liên kết giá trị của các điều khiển HTML (đầu vào, chọn, textarea) với dữ liệu ứng dụng.

Lệnh ng-bind liên kết dữ liệu ứng dụng với chế độ xem HTML.

<div ng-app="">
    <p>Name: <input type="text" ng-model="name"></p>
    <p ng-bind="name"></p>
</div>

Kiểm tra hướng dẫn này, ít nhất với tôi đó là một trong những lời giới thiệu tốt nhất về Angular. Một cách tiếp cận đầy đủ hơn sẽ là tất cả mọi thứ mà @ mark-rajcok đã nói trước đây.


4

Nhìn vào tài liệu, các chỉ thị là các cấu trúc bạn có thể viết rằng angularjs phân tích cú pháp để tạo các đối tượng và hành vi. widget của bạn (thành phần) được cấu trúc, cách nó hoạt động và cách nó được cung cấp với dữ liệu. Angularjs sau đó chạy theo các chỉ thị đó để dịch chúng thành mã html / javascript hoạt động.

Các chỉ thị có để bạn có thể xây dựng các thành phần (vật dụng) phức tạp hơn bằng cách sử dụng ngữ nghĩa phù hợp. Chỉ cần xem ví dụ angularjs của các lệnh - chúng đang xác định khung tab (tất nhiên không hợp lệ trong HTML thông thường). Nó trực quan hơn so với việc sử dụng như div hoặc s để tạo cấu trúc mà sau đó được tạo kiểu để trông giống như một khung tab.


Tôi đã thêm những gì tôi cảm thấy là một chút ít giải thích kỹ thuật.
raam86

1
Cảm ơn điều này khá hữu ích. Vì vậy, có lẽ tôi có thể nghĩ về nó như một loại khuôn mẫu động (tương tự như một lớp trong lập trình OO) gói gọn một thành phần, mô tả nó bằng các thuộc tính và hành vi, có khả năng được khởi tạo và có thể thể hiện chính nó với DOM? Và lý do nó tồn tại (so với đối tượng javascript hoặc mẫu html) là để cho phép các thẻ HTML thực hiện các hành vi giống như đối tượng năng động hơn để chúng có thể bắt đầu trở nên dễ thao tác trong lập trình loại OO?
tohster

Có và không. Tôi sẽ không nói rằng lý do các chỉ thị tồn tại có liên quan nhiều đến việc chúng có thể bị thao túng trong lập trình OO. Trong thực tế, toàn bộ cách tiếp cận angularjs đối với khung cảm thấy liên quan nhiều đến các thuộc tính nút HTML và các nút DOM tùy ý thay vì viết mã OO Javascript. Tôi có được sự rung cảm đó khi nhìn vào tất cả các ví dụ về cách angularjs giải quyết các vấn đề hàng ngày. Tôi muốn nói rằng lý do chính đằng sau các chỉ thị là có cách để nhúng các hành vi và dữ liệu trong một thành phần có cấu trúc ngữ nghĩa.
WTK

3

Trong AngularJS Directives là các đánh dấu lại html cho một phần tử DOM DOM như thuộc tính (hạn chế- A), tên thành phần (hạn chế- E), nhận xét (hạn chế- M) hoặc lớp CSS (hạn chế - C) cho trình biên dịch HTML của AngularJS ($ biên dịch) để thực hiện một hành vi được chỉ định cho phần tử DOM đó hoặc thậm chí biến đổi phần tử DOM và các phần tử con của nó. Ví dụ về một số là ng-bind, ng-hide / show, v.v.


2

Trang chủ rất rõ ràng về điều này: Khi bạn di chuột qua các tab trong phần cuối cùng:

Chúng tôi đã mở rộng vốn từ vựng của HTML với một tabs yếu tố tùy chỉnh . Các tabstóm tắt cấu trúc HTML phức tạp và hành vi cần thiết để render các tab. Kết quả là một cái nhìn dễ đọc hơn và cú pháp rất dễ sử dụng lại. "

Sau đó trong tab tiếp theo:

angular.module('components', []).
  directive('tabs', function() {
    return {
      restrict: 'E',
      transclude: true,
      scope: {},
      controller: function($scope, $element) {
        var panes = $scope.panes = [];

        $scope.select = function(pane) {
          angular.forEach(panes, function(pane) {
            pane.selected = false;
          });
          pane.selected = true;
        }

Vì vậy, bạn có thể phát minh ra các phần tử html tức là tabsvà để cho góc cạnh xử lý kết xuất các phần tử đó.


2
Cảm ơn đã phản ứng nhanh chóng! Vậy mục đích của một chỉ thị là mở rộng vốn từ vựng của HTML bằng cách tạo các thẻ và thuộc tính tùy chỉnh? Điều đó có vẻ khá mạnh mẽ, mặc dù nó dường như giải quyết phạm vi vấn đề rộng hơn nhiều so với "MVW". Những người khác BTW có thể không đồng ý, nhưng tôi nghĩ rằng việc cuộn xuống cuối trang và sau đó di chuột qua một từ siêu liên kết, và sau đó đọc một chú giải công cụ bật lên mà không một lần nhắc đến từ 'chỉ thị' không chính xác là " rất rõ ràng "định nghĩa về một chỉ thị là gì. Tuy nhiên, thực sự đánh giá cao phản ứng nhanh chóng.
tohster

Đúng! Bạn có thể kiểm tra fiddle này họ thực hiện. Html thực tế khác với cái bật trong khung html.
raam86
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.