Dấu ngoặc đơn hàm javascript

XPath sử dụng các biểu thức đường dẫn để chọn các nút hoặc tập hợp nút trong tài liệu XML. Nút được chọn bằng cách đi theo một đường dẫn hoặc các bước


Tài liệu Ví dụ XML

Chúng tôi sẽ sử dụng tài liệu XML sau trong các ví dụ bên dưới


Harry Potter29. 99


Học XML39. 95


Chọn nút

XPath sử dụng các biểu thức đường dẫn để chọn các nút trong tài liệu XML. Nút được chọn bằng cách đi theo một đường dẫn hoặc các bước. Các biểu thức đường dẫn hữu ích nhất được liệt kê dưới đây

ExpressionDescriptionnodenameChọn tất cả các nút có tên "nodename"/Chọn từ nút gốc//Chọn các nút trong tài liệu từ nút hiện tại khớp với lựa chọn bất kể chúng ở đâu. Chọn nút hiện tại. Chọn cha của nút hiện tại@Chọn thuộc tính

Trong bảng dưới đây, chúng tôi đã liệt kê một số biểu thức đường dẫn và kết quả của các biểu thức

Biểu thức đường dẫnResultbookstoreChọn tất cả các nút có tên "hiệu sách"/hiệu sáchChọn phần tử gốc hiệu sách

Ghi chú. Nếu đường dẫn bắt đầu bằng dấu gạch chéo ( / ) thì nó luôn đại diện cho một đường dẫn tuyệt đối đến một phần tử

cửa hàng sách/sáchChọn tất cả các phần tử sách là con của cửa hàng sách//bookChọn tất cả các phần tử sách bất kể chúng ở đâu trong tài liệubookstore//bookChọn tất cả các phần tử sách là hậu duệ của phần tử cửa hàng sách, bất kể chúng ở đâu dưới phần tử cửa hàng sách//

Vị ngữ

Các vị từ được sử dụng để tìm một nút cụ thể hoặc một nút chứa một giá trị cụ thể

Vị ngữ luôn được đặt trong dấu ngoặc vuông

Trong bảng dưới đây, chúng tôi đã liệt kê một số biểu thức đường dẫn với các vị từ và kết quả của các biểu thức

Biểu thức đường dẫnResult/bookstore/book[1]Chọn phần tử sách đầu tiên là phần tử con của phần tử hiệu sách

Ghi chú. Trong IE 5,6,7,8,9 nút đầu tiên là [0], nhưng theo W3C, đó là [1]. Để giải quyết vấn đề này trong IE, hãy đặt SelectionLanguage thành XPath

Nếu hình (nguồn) sau đây trông có vẻ không hợp lý, thì bài viết này có thể dành cho bạn

Dấu ngoặc đơn hàm javascript
phạm vi. png

từ chối trách nhiệm. bài viết dựa trên Angular v1. 2. 10 cây @

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
8

Chỉ thị là cái quái gì?

Chỉ thị thường là các thành phần nhỏ nhằm tương tác với DOM, trong Angular. Chúng được sử dụng như một lớp trừu tượng trên cùng của DOM và hầu hết các thao tác có thể đạt được mà không cần chạm vào các phần tử DOM, được bao bọc trong jQuery, jqLite hoặc cách khác. Điều này được thực hiện bằng cách sử dụng các biểu thức và các lệnh khác để đạt được kết quả bạn muốn

Các chỉ thị trong lõi Góc có thể liên kết một thuộc tính phần tử (chẳng hạn như khả năng hiển thị, danh sách lớp, văn bản bên trong, HTML bên trong hoặc giá trị) với thuộc tính phạm vi hoặc biểu thức. Đáng chú ý nhất, các ràng buộc này sẽ được cập nhật bất cứ khi nào các thay đổi trong phạm vi được tiêu hóa, sử dụng đồng hồ. Tương tự và theo hướng ngược lại, các thuộc tính DOM chúng ta có thể “đã xem” bằng cách sử dụng hàm

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
9, hàm này sẽ kích hoạt gọi lại bất cứ khi nào thuộc tính đã xem thay đổi

Chỉ thị, nói một cách đơn giản, là bộ mặt quan trọng nhất của Angular. Nếu bạn thành thạo các chỉ thị, bạn sẽ không gặp bất kỳ sự cố nào khi xử lý các ứng dụng Angular. Tương tự như vậy, nếu bạn không quản lý để nắm bắt các chỉ thị, bạn sẽ mù quáng nắm lấy ống hút, không biết mình sẽ làm gì tiếp theo. Nắm vững các lệnh cần có thời gian, đặc biệt nếu bạn đang cố gắng tránh xa việc chỉ đơn thuần gói một đoạn mã do jQuery cung cấp và gọi nó là một ngày

Mặc dù các lệnh được cho là thực hiện tất cả các thao tác DOM, nhưng đó là sức mạnh tổng hợp mà bạn nên khai thác chứ không phải jQuery

sức mạnh tổng hợp. Sức mạnh tổng hợp là nước sốt bí mật được tìm kiếm từ lâu

Nước sốt bí mật. sức mạnh tổng hợp

Sức mạnh tổng hợp là một thuật ngữ mà tôi đã trở nên thân thiết vài năm trước, vì tôi đã từng. Các bộ bài tốt nhất trong MTG thường là những bộ bài mà mỗi lá bài trong bộ bài sáu mươi lá của bạn được trao quyền bởi mối quan hệ của nó với phần còn lại của bộ bài của bạn. Trong các bộ bài hiệp lực này, bạn chạy với lợi thế đáng kể. mỗi lá bài bạn rút có khả năng cải thiện tác động của mỗi lá bài trên tay bạn và hiệu ứng này tăng theo cấp số nhân khi bạn rút thêm lá bài. Có thể nói, hai yếu tố quan trọng nhất để xây dựng một bộ bài tốt là nguồn rút bài và tiềm năng hiệp đồng.

Nó không khác với các ứng dụng Angular. Trong các ứng dụng Angular, bạn càng sử dụng nhiều cơ chế bên trong của Angular, chẳng hạn như phạm vi, sự kiện, dịch vụ và các tùy chọn khác nhau có sẵn cho các lệnh, thì ứng dụng của bạn sẽ càng có tính hiệp lực cao hơn. Sức mạnh tổng hợp chuyển thành khả năng tái sử dụng. Các thành phần có tính đồng bộ cao cho phép bạn chia sẻ chúng giữa các phần của ứng dụng hoặc thậm chí hoàn toàn giữa các ứng dụng

Sức mạnh tổng hợp làm cho các ứng dụng Angular hoạt động như thể ma thuật tồn tại. Sức mạnh tổng hợp làm cho sự tương tác phức tạp trở nên dễ dàng, hợp lý và dễ hiểu. Sức mạnh tổng hợp là thứ thúc đẩy sự tương tác phức tạp thành các khối xây dựng của nó, chia nhỏ nó thành các yếu tố cần thiết mà bất kỳ ai cũng có thể hiểu được. Sức mạnh tổng hợp ở khắp mọi nơi, sức mạnh tổng hợp không chỉ nằm trong mã mà bạn còn có thể tìm thấy nó trong UX. Một ứng dụng hiệp đồng sẽ cảm thấy tự nhiên hơn, dễ sử dụng hơn và trực quan hơn. Bạn sẽ cảm thấy như bạn biết ứng dụng và thường đoán chính xác bước tiếp theo sẽ như thế nào, bởi vì tác giả ứng dụng quan tâm đến những gì bạn nghĩ sẽ xảy ra

Trong Angular, sức mạnh tổng hợp có nghĩa là có thể xây dựng các chỉ thị, dịch vụ và bộ điều khiển được thành phần hóa, có thể được sử dụng lại thường xuyên khi chúng được sử dụng lại. Chẳng hạn, bạn có thể có một lệnh đơn giản bật một lớp dựa trên biểu thức phạm vi đã xem và tôi cho rằng đó có thể là một lệnh khá phổ biến, được sử dụng ở mọi nơi trong ứng dụng của bạn, để báo hiệu trạng thái của một thành phần cụ thể trong ứng dụng của bạn. . Bạn có thể có một dịch vụ để tổng hợp xử lý phím tắt và có bộ điều khiển, chỉ thị và các dịch vụ khác, đăng ký phím tắt với dịch vụ đó, root tất cả việc xử lý phím tắt của bạn trong một dịch vụ độc lập

Chỉ thị cũng là các phần chức năng có thể tái sử dụng, nhưng thông thường, chúng được liên kết với các đoạn DOM hoặc mẫu, thay vì chỉ cung cấp chức năng. Đánh dấu cũng quan trọng không kém trong việc cung cấp sức mạnh tổng hợp, nếu không muốn nói là hơn thế. Đã đến lúc tôi cung cấp cho bạn thông tin chi tiết về các chỉ thị Angular và các trường hợp sử dụng của chúng

Tạo một chỉ thị

Trước đó, tôi đã liệt kê từng thuộc tính có sẵn trên một phạm vi trong Angular và tôi đã sử dụng điều đó để giải thích cơ chế phân loại và cách hoạt động của phạm vi. Tôi sẽ làm tương tự với các chỉ thị, nhưng lần này tôi sẽ xem xét các thuộc tính của đối tượng được trả về bởi hàm xuất xưởng của một chỉ thị và cách mỗi thuộc tính đó ảnh hưởng đến chỉ thị mà chúng ta đang xác định

Điều đầu tiên cần lưu ý là tên của chỉ thị. Hãy xem xét một ví dụ ngắn gọn

angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});

Mặc dù trong đoạn mã trên, tôi đang xác định một lệnh có tên là

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
0, thay vào đó, tôi sẽ sử dụng phiên bản nét đứt của tên đó trong phần đánh dấu. Nghĩa là, nếu lệnh này được triển khai như một thuộc tính, tôi có thể cần tham chiếu nó như bên dưới, trong HTML của mình

<span piece-of-food>span>

Theo mặc định, các lệnh chỉ có thể được kích hoạt dưới dạng thuộc tính, nhưng nếu bạn muốn thay đổi hành vi này thì sao?

  1. Xác định cách một lệnh có thể được áp dụng trong đánh dấu
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});

Vì một số lý do mà tôi không thể hiểu được, bằng cách nào đó, họ đã quyết định làm xáo trộn khung dài dòng, và chúng tôi đã kết thúc bằng một chữ cái in hoa để xác định cách giới hạn một lệnh. Đây là danh sách

  • angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    4 , các thuộc tính được cho phép,
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    5
  • angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    6 Các yếu tố được cho phép,
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    7
  • angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    8 Như một tên lớp,
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    9
  • angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        restrict: 'E',
        template: // ...
      };
    });
    
    30 Như một nhận xét,
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        restrict: 'E',
        template: // ...
      };
    });
    
    31
  • angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        restrict: 'E',
        template: // ...
      };
    });
    
    32 Bạn có thể kết hợp bất kỳ thứ nào trong số này để nới lỏng hạn chế một chút

Đừng bao giờ sử dụng

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
8 hoặc
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
30 để hạn chế chỉ thị của bạn. Sử dụng
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
8 không nổi bật trong đánh dấu và sử dụng
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
30 nhằm tương thích ngược. Tuy nhiên, nếu bạn cảm thấy hài hước, bạn có thể đặt
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
1 thành
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
38

Bạn có nhớ lần trước tôi đã nói hãy nghe lời khuyên với một nhúm muối không?

Thật không may, phần còn lại của các thuộc tính trong một đối tượng định nghĩa chỉ thị khó hiểu hơn nhiều

  1. Đặt cách một lệnh tương tác với phạm vi
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      var definition = { // <- these are the options we'll be discussing
        template: // ...
      };
      return definition;
    });
    
    20

Vì chúng ta đã thảo luận chi tiết về phạm vi trong phần trước, nên việc học cách sử dụng thuộc tính

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
39 đúng cách không quá khó khăn. Hãy bắt đầu với giá trị mặc định,
angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
22, trong đó chuỗi phạm vi không bị ảnh hưởng. bạn nhận được bất kỳ phạm vi nào được tìm thấy trên phần tử được liên kết, tuân theo các quy tắc tôi đã nêu trong phần trước

Để nguyên chuỗi phạm vi rõ ràng là hữu ích khi chỉ thị của bạn hoàn toàn không tương tác với phạm vi, nhưng điều đó hiếm khi xảy ra. Một tình huống phổ biến hơn nhiều khi không chạm vào phạm vi là hữu ích, đó là khi tạo một lệnh không có lý do gì để được thực hiện nhiều lần trên bất kỳ phạm vi cụ thể nào và chỉ tương tác với một thuộc tính phạm vi duy nhất, tên lệnh. Điều này mang tính khai báo nhất khi được kết hợp với

angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
23, giá trị mặc định của
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
1

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
3

Lấy bút. Có một vài điều cần lưu ý ở đây, mà chúng ta chưa thảo luận. Bạn sẽ tìm hiểu thêm về tài sản

angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
25 sau trong bài viết. Hiện tại, bạn có thể coi nó như một bộ điều khiển chạy cho từng phiên bản của lệnh

Trong chức năng liên kết chỉ thị, chúng ta có thể truy cập

angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
26, đây là tập hợp các thuộc tính có trên
angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
27. Bộ sưu tập này có một phương thức đặc biệt, được gọi là
angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
28, sẽ kích hoạt một cuộc gọi lại. Nếu không theo dõi thuộc tính để biết các thay đổi, thuộc tính sẽ không bao giờ thuộc phạm vi và chúng tôi sẽ không thể liên kết với thuộc tính đó trong mẫu của mình

Chúng ta có thể thay đổi mã ở trên, làm cho nó hữu ích hơn nhiều, bằng cách thêm

angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
29 vào hỗn hợp. Hãy nhớ làm thế nào nó có thể được sử dụng để đánh giá một biểu thức dựa trên một phạm vi?

angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
2____35

Trong trường hợp này, tôi đang đánh giá giá trị thuộc tính,

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
50, dựa trên phạm vi, đã xác định
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
51 tại bộ điều khiển. Tất nhiên, bạn có thể trực tiếp sử dụng mẫu như
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
52, nhưng điều đó sẽ yêu cầu kiến ​​thức cụ thể về thuộc tính nào trong phạm vi bạn muốn theo dõi. Mẫu này cung cấp tính linh hoạt hơn một chút, mặc dù bạn vẫn sẽ chia sẻ phạm vi trên tất cả các lệnh, điều này có thể dẫn đến hành vi không mong muốn nếu bạn thử thêm nhiều lệnh trong cùng một phạm vi

Phạm vi trẻ em vui tươi

Bạn có thể giải quyết vấn đề đó bằng cách tạo một phạm vi con, kế thừa nguyên mẫu từ cha của nó. Để tạo phạm vi con, bạn chỉ cần khai báo

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
53

<span piece-of-food>span>
0
<span piece-of-food>span>
1

Như bạn có thể thấy, giờ đây chúng ta có thể sử dụng nhiều phiên bản của lệnh và nhận được hành vi mong muốn, bởi vì mỗi lệnh đang tạo phạm vi riêng của nó. Tuy nhiên, có một hạn chế. nhiều chỉ thị trên một phần tử đều có cùng phạm vi

Nếu nhiều lệnh trên cùng một phần tử yêu cầu một phạm vi mới, thì chỉ một phạm vi mới được tạo

Phạm vi cô đơn, biệt lập

Một tùy chọn cuối cùng là tạo phạm vi cục bộ hoặc cô lập. Sự khác biệt giữa phạm vi cô lập và phạm vi con là phạm vi cục bộ không kế thừa từ cha mẹ của chúng (nhưng nó vẫn có thể truy cập được trên

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
54). Bạn có thể khai báo một phạm vi cô lập như thế này.
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
55. Bạn có thể thêm các thuộc tính vào đối tượng, thuộc tính này được liên kết dữ liệu với phạm vi chính nhưng có thể truy cập được trên phạm vi cục bộ. Giống như
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
1, các thuộc tính phạm vi cô lập có cú pháp ngắn gọn nhưng khó hiểu, trong đó bạn có thể sử dụng các ký hiệu như
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
57,
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
58 và
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
59 để xác định cách liên kết thuộc tính

Bạn có thể bỏ qua tên thuộc tính nếu bạn định sử dụng tên đó làm khóa trong phạm vi cục bộ của mình. Điều đó có nghĩa là,

<span piece-of-food>span>
00 là dạng viết tắt của ________ 401, chúng tương đương nhau

Vậy những biểu tượng đó có ý nghĩa gì?

Người quan sát thuộc tính,
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
58

Sử dụng

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
58 liên kết với kết quả của việc quan sát một thuộc tính đối với phạm vi cha

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
5
<span piece-of-food>span>
0

Điều này là dành cho những thay đổi và cập nhật phạm vi địa phương của chúng tôi. Tất nhiên, sử dụng ký hiệu

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
58 thì “Góc cạnh” hơn nhiều

<span piece-of-food>span>
1

Trình quan sát thuộc tính hữu ích nhất khi sử dụng các tùy chọn cho một lệnh. Tuy nhiên, nếu chúng ta muốn thay đổi hành vi của lệnh dựa trên việc thay đổi các tùy chọn, thì sẽ hợp lý hơn nếu chúng ta tự viết dòng

<span piece-of-food>span>
08, thay vì có Angular và tạo một chiếc đồng hồ ở phía chúng ta, việc này sẽ chậm hơn

Trong những trường hợp đó, chỉ cần thay thế

<span piece-of-food>span>
09, trong trình xử lý
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
9 được hiển thị ở trên, thành bất kỳ thứ gì bạn sẽ đặt trên trình nghe
<span piece-of-food>span>
11, nên làm

Điều quan trọng cần lưu ý là, khi xử lý

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
58, chúng ta đang nói về việc quan sát và thuộc tính, thay vì ràng buộc với phạm vi gốc

Trình tạo biểu thức,
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
57

Sử dụng

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
57 cung cấp cho bạn một hàm đánh giá biểu thức, trong ngữ cảnh của phạm vi gốc

<span piece-of-food>span>
2
<span piece-of-food>span>
3

Dưới đây tôi đã phác thảo cách bạn có thể triển khai chức năng tương tự bên trong chức năng liên kết, nếu bạn không biết về

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
57. Cái này dài hơn một chút so với
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
58, như đã từng, xây dựng một chức năng có thể tái sử dụng

<span piece-of-food>span>
4

Trình tạo biểu thức, như chúng ta có thể thấy, tạo ra một phương thức truy vấn phạm vi cha. Bạn có thể thực thi phương thức bất cứ khi nào bạn muốn và thậm chí xem nó để thay đổi đầu ra. Phương pháp này nên được coi là truy vấn chỉ đọc trên biểu thức gốc và như vậy sẽ hữu ích nhất trong hai trường hợp. Đầu tiên là nếu bạn cần theo dõi các thay đổi trên phạm vi cha, trong trường hợp đó, bạn sẽ thiết lập theo dõi trên biểu thức hàm,

<span piece-of-food>span>
17, về bản chất, đó là những gì chúng ta đã làm trong ví dụ trên

Một tình huống khác mà điều này có thể hữu ích là khi bạn cần truy cập vào một phương thức trên phạm vi cha. Giả sử phạm vi cha có phương thức làm mới bảng, trong khi phạm vi cục bộ của bạn đại diện cho một hàng của bảng. Khi hàng của bảng bị xóa, bạn có thể muốn làm mới bảng. Nếu nút nằm trong phạm vi con, thì sẽ hợp lý khi sử dụng liên kết

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
57 để truy cập chức năng làm mới trên phạm vi cha. Đó chỉ là một ví dụ giả định, vì bạn có thể thích sử dụng các sự kiện cho loại điều đó hoặc thậm chí có thể cấu trúc ứng dụng của bạn theo một cách nào đó để tránh những thứ phức tạp như thế

Liên kết hai chiều,
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
59

Sử dụng

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
59 thiết lập liên kết hai chiều giữa phạm vi cục bộ và phạm vi chính

<span piece-of-food>span>
5
<span piece-of-food>span>
6

Liên kết hai chiều hơn

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
57 hoặc
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
58

<span piece-of-food>span>
7

Hình thức liên kết dữ liệu này được cho là hữu ích nhất trong cả ba. Trong trường hợp này, thuộc tính phạm vi cha được giữ đồng bộ với phạm vi cục bộ. Bất cứ khi nào giá trị phạm vi cục bộ được cập nhật, nó sẽ được đặt trên phạm vi chính. Tương tự như vậy, bất cứ khi nào giá trị phạm vi cha thay đổi, phạm vi cục bộ sẽ được cập nhật. Kịch bản đơn giản nhất mà tôi dành cho bạn khi điều này có thể hữu ích, đó là bất cứ khi nào bạn có một phạm vi con được sử dụng để biểu diễn một mô hình con của phạm vi cha. Hãy nghĩ về bảng CRUD (Tạo, Đọc, Cập nhật, Xóa) điển hình của bạn. Toàn bộ bảng sẽ là phạm vi cha, trong khi mỗi hàng sẽ được chứa trong một lệnh cô lập, liên kết với mô hình dữ liệu của hàng thông qua liên kết

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
59 hai chiều. Điều này sẽ cho phép mô đun hóa trong khi vẫn có thể giao tiếp hiệu quả giữa bảng chính và bảng con của nó

Điều đó tốn nhiều từ, nhưng tôi nghĩ mình đã tóm tắt được cách thức hoạt động của thuộc tính

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
39 khi khai báo các chỉ thị và các trường hợp sử dụng phổ biến nhất là gì. Đã đến lúc chuyển sang các thuộc tính khác trong đối tượng định nghĩa chỉ thị, phải không?

Mẫu xem hợp lý

Chỉ thị có hiệu quả nhất khi chúng chứa các đoạn mã HTML nhỏ, có thể tái sử dụng. Đó là nơi sức mạnh thực sự của các chỉ thị đến từ. Các mẫu này có thể được cung cấp ở dạng văn bản thuần túy hoặc dưới dạng tài nguyên mà Angular sẽ truy vấn khi khởi động lệnh

  1. Là cách bạn sẽ cung cấp mẫu xem dưới dạng văn bản thuần túy.
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    56
  2. Cho phép bạn cung cấp url cho một mẫu HTML.
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      return {
        template: '{{pieceOfFood}}',
        link: function (scope, element, attrs) {
          attrs.$observe('pieceOfFood', function (value) {
            scope.pieceOfFood = value;
          });
        }
      };
    });
    
    58

Sử dụng

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
57 để tách HTML khỏi chức năng liên kết của bạn thật tuyệt vời. Thực hiện một yêu cầu AJAX bất cứ khi nào bạn muốn khởi tạo một lệnh lần đầu tiên, không quá nhiều. Tuy nhiên, bạn có thể phá vỡ yêu cầu AJAX nếu bạn điền trước
<span piece-of-food>span>
00 bằng một tác vụ xây dựng, chẳng hạn như grunt-angular-templates. Đó sẽ là “tốt nhất của cả hai thế giới”. Tách các mối quan tâm mà không cần thêm chi phí cho các cuộc gọi AJAX

Bạn cũng có thể cung cấp một

<span piece-of-food>span>
01 như một
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    template: '{{pieceOfFood}}',
    link: function (scope, element, attrs) {
      attrs.$observe('pieceOfFood', function (value) {
        scope.pieceOfFood = value;
      });
    }
  };
});
55, nhưng điều này không cần thiết và cũng không hữu ích

  1. <span piece-of-food>span>
    
    03 Mẫu có nên được chèn dưới dạng phần tử con hoặc được đặt trong dòng không?

Tài liệu về tài sản này rất khó hiểu

<span piece-of-food>span>
03

Chỉ định nơi mẫu sẽ được chèn. Mặc định là

<span piece-of-food>span>
05

  • <span piece-of-food>span>
    
    06 Mẫu sẽ thay thế phần tử hiện tại
  • <span piece-of-food>span>
    
    05 Mẫu sẽ thay thế nội dung của phần tử hiện tại

Vì vậy, khi thay thế là

<span piece-of-food>span>
05, lệnh thực sự thay thế phần tử? . Nếu bạn kiểm tra cây bút này, thì bạn sẽ phát hiện ra rằng phần tử chỉ được thêm vào nếu
<span piece-of-food>span>
09 và nó được thêm vào, nếu
<span piece-of-food>span>
10

Theo nguyên tắc chung, hãy thử và giữ thay thế ở mức tối thiểu. Tất nhiên, các chỉ thị nên cố gắng giữ cho sự can thiệp vào DOM càng gần càng tốt, bất cứ khi nào có thể

Các chỉ thị được biên dịch, dẫn đến chức năng liên kết trước và chức năng liên kết sau. Bạn có thể xác định mã trả về các hàm này hoặc chỉ cung cấp chúng. Dưới đây là những cách khác nhau mà bạn có thể cung cấp các chức năng liên kết. Tôi cảnh báo bạn, đây là một trong những “tính năng” khác trong Angular mà tôi cảm thấy có nhiều nhược điểm hơn, bởi vì nó khiến những người mới đến bối rối mà chẳng thu được gì. Hãy chứng kiến

<span piece-of-food>span>
8
<span piece-of-food>span>
9____00
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
1

Trên thực tế, bạn thậm chí có thể quên đối tượng định nghĩa chỉ thị mà chúng ta đã thảo luận cho đến nay và chỉ trả về một hàm sau liên kết. Tuy nhiên, điều này không được khuyến nghị ngay cả bởi những người nhìn trộm góc cạnh, vì vậy tốt hơn hết bạn nên tránh xa nó

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
2

Trước khi tiếp tục, đây là một lưu ý quan trọng từ tài liệu Angular mà tôi muốn bạn xem qua

Ghi chú. Phiên bản mẫu và phiên bản liên kết có thể là các đối tượng khác nhau nếu mẫu đã được sao chép. Vì lý do này, không an toàn khi thực hiện bất kỳ điều gì khác ngoài các phép biến đổi DOM áp dụng cho tất cả các nút DOM được nhân bản trong hàm biên dịch. Cụ thể, đăng ký trình nghe DOM nên được thực hiện trong chức năng liên kết thay vì trong chức năng biên dịch

Các hàm biên dịch hiện có tham số thứ ba, một hàm liên kết nhúng, nhưng nó không được dùng nữa. Ngoài ra, bạn không nên thay đổi DOM trong các chức năng biên dịch (trên

<span piece-of-food>span>
11). Chỉ cần tự giúp mình và tránh hoàn toàn
<span piece-of-food>span>
12, cung cấp trực tiếp các chức năng liên kết trước và sau liên kết. Thông thường, một chức năng sau liên kết là vừa đủ, đó là những gì bạn đang sử dụng khi gán một hàm
angular.module('PonyDeli').directive('pieceOfFood', function () {
  var definition = { // <- these are the options we'll be discussing
    template: // ...
  };
  return definition;
});
25 cho đối tượng định nghĩa

Tôi có một quy tắc cho bạn ở đây. Luôn sử dụng chức năng post-linking. Nếu một phạm vi hoàn toàn cần phải được điền sẵn trước khi DOM được liên kết, thì hãy thực hiện điều đó trong hàm tiền liên kết, nhưng liên kết chức năng trong hàm sau liên kết, như bạn thường làm. Bạn sẽ hiếm khi cần phải làm điều này, nhưng tôi nghĩ nó vẫn đáng được đề cập

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
3
  1. Một thể hiện của bộ điều khiển trên chỉ thị

Các chỉ thị có thể có các bộ điều khiển, điều này hợp lý, bởi vì các chỉ thị có thể tạo ra một phạm vi. Bộ điều khiển được chia sẻ giữa tất cả các lệnh trên phạm vi và nó có thể truy cập được dưới dạng đối số thứ tư trong các chức năng liên kết. Các bộ điều khiển này là một kênh liên lạc hữu ích giữa các lệnh ở cùng cấp độ phạm vi, có thể được chứa trong chính lệnh đó

  1. Bí danh bộ điều khiển để tham chiếu nó trong mẫu

Sử dụng bí danh bộ điều khiển cho phép sử dụng bộ điều khiển trong chính mẫu, vì nó sẽ được cung cấp trong phạm vi

  1. Tôi sẽ ném nếu bạn không liên kết một số (các) chỉ thị khác trên phần tử này

Tài liệu về yêu cầu đơn giản một cách đáng ngạc nhiên, vì vậy tôi sẽ gian lận và dán nó vào đây

Yêu cầu một lệnh khác và thêm bộ điều khiển của nó làm đối số thứ tư cho chức năng liên kết.

<span piece-of-food>span>
16 lấy tên chuỗi (hoặc mảng chuỗi) của (các) lệnh để truyền vào. Nếu một mảng được sử dụng, đối số được đưa vào sẽ là một mảng theo thứ tự tương ứng. Nếu không tìm thấy lệnh như vậy hoặc nếu lệnh không có bộ điều khiển, thì sẽ xảy ra lỗi. Tên có thể được thêm tiền tố với

  • <span piece-of-food>span>
    
    18 Xác định vị trí bộ điều khiển cần thiết trên phần tử hiện tại. Ném lỗi nếu không tìm thấy
  • <span piece-of-food>span>
    
    19 Cố gắng xác định vị trí bộ điều khiển được yêu cầu hoặc chuyển
    <span piece-of-food>span>
    
    20 đến
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      var definition = { // <- these are the options we'll be discussing
        template: // ...
      };
      return definition;
    });
    
    25 fn nếu không tìm thấy
  • <span piece-of-food>span>
    
    22 Xác định vị trí bộ điều khiển được yêu cầu bằng cách tìm kiếm cha mẹ của phần tử. Ném lỗi nếu không tìm thấy
  • <span piece-of-food>span>
    
    23 Cố gắng xác định vị trí bộ điều khiển được yêu cầu bằng cách tìm kiếm cha mẹ của phần tử hoặc chuyển
    <span piece-of-food>span>
    
    20 đến
    angular.module('PonyDeli').directive('pieceOfFood', function () {
      var definition = { // <- these are the options we'll be discussing
        template: // ...
      };
      return definition;
    });
    
    25 fn nếu không tìm thấy
  1. Xác định thứ tự áp dụng các chỉ thị

thời gian gian lận

Khi có nhiều lệnh được xác định trên một phần tử DOM, đôi khi cần chỉ định thứ tự áp dụng các lệnh đó.

<span piece-of-food>span>
26 được sử dụng để sắp xếp các lệnh trước khi hàm
<span piece-of-food>span>
12 của chúng được gọi. Ưu tiên được định nghĩa là một số. Các chỉ thị có số lớn hơn
<span piece-of-food>span>
26 được biên dịch trước. Các chức năng trước liên kết cũng được chạy theo thứ tự ưu tiên, nhưng các chức năng sau liên kết được chạy theo thứ tự ngược lại. Thứ tự của các lệnh có cùng mức độ ưu tiên không được xác định. Ưu tiên mặc định là
<span piece-of-food>span>
30

  1. Ngăn chặn việc xử lý thêm các chỉ thị

Nếu được đặt thành true thì

<span piece-of-food>span>
26 hiện tại sẽ là tập lệnh cuối cùng sẽ thực thi (bất kỳ lệnh nào ở mức ưu tiên hiện tại sẽ vẫn thực thi vì thứ tự thực hiện trên cùng một
<span piece-of-food>span>
26 không được xác định)

Loại trừ để giành được nhiều chiến thắng
  1. Biên dịch nội dung của phần tử và cung cấp nội dung đó cho chỉ thị

Tôi đã để dành thứ tốt nhất (tệ nhất?) cho lần cuối. Thuộc tính này cho phép hai giá trị, để vui hơn và ít lợi nhuận hơn. Bạn có thể đặt nó thành

<span piece-of-food>span>
06, cho phép loại trừ hoặc thành
<span piece-of-food>span>
36, trong trường hợp đó, toàn bộ phần tử, bao gồm bất kỳ lệnh nào được xác định ở mức ưu tiên thấp hơn, được nhúng

Ở cấp độ cao, loại trừ cho phép người tiêu dùng của một lệnh xác định một đoạn mã HTML mà sau đó có thể được đưa vào một số phần của lệnh đó, sử dụng lệnh

<span piece-of-food>span>
37. Điều này nghe có vẻ quá phức tạp và nó chỉ hơi phức tạp. Một ví dụ có thể làm cho mọi thứ rõ ràng hơn cho bạn

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
4
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
5

Tất nhiên, bạn có thể kiểm tra nó trên CodePen. Điều gì xảy ra khi bạn cố gắng đưa phạm vi vào hỗn hợp? . Đây là những gì bạn mong đợi, bởi vì nội dung được nhúng được xác định trong mã tiêu thụ, thuộc về phạm vi chính chứ không phải phạm vi của lệnh. Lệnh vẫn liên kết với phạm vi cục bộ của nó, như thường lệ

angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
6
angular.module('PonyDeli').directive('pieceOfFood', function () {
  return {
    restrict: 'E',
    template: // ...
  };
});
7

Bạn cũng có thể tìm thấy cái đó trên CodePen. Ở đó bạn có nó, loại trừ, làm sáng tỏ

Đọc thêm

Đây là một số tài nguyên bổ sung mà bạn có thể đọc để mở rộng hơn nữa sự hiểu biết của mình về Angular

  • Giá đỡ góc (Phần I), Ống ngắm súng trường
  • Làm cách nào để chọn giữa không có phạm vi mới, phạm vi con hoặc phạm vi cô lập?
  • Khái niệm cơ bản về loại trừ (chụp màn hình)
  • <span piece-of-food>span>
    
    38 so với
    <span piece-of-food>span>
    
    39
  • Hiểu Chỉ thị,
    <span piece-of-food>span>
    
    40 và
    <span piece-of-food>span>
    
    12

Vui lòng bình luận về bất kỳ vấn đề nào liên quan đến bài viết này, để mọi người có thể hưởng lợi từ phản hồi của bạn. Ngoài ra, bạn nên theo dõi tôi trên Twitter