Các nhà trang trí của người Viking là gì và họ được sử dụng như thế nào?


148

Tôi tò mò chính xác những gì trang trí trong AngularJS. Không có nhiều thông tin trực tuyến cho các nhà trang trí tiết kiệm cho một sự phô trương trong tài liệu AngularJS và một đề cập ngắn gọn (mặc dù thú vị) trong một video youtube .

Như những kẻ Angular đặt nó là một vật trang trí là:

Trang trí dịch vụ, cho phép người trang trí chặn việc tạo cá thể dịch vụ. Thể hiện được trả về có thể là thể hiện ban đầu hoặc một thể hiện mới ủy nhiệm cho thể hiện ban đầu.

Tôi thực sự không biết điều đó có nghĩa là gì và tôi không chắc tại sao bạn lại tách logic này ra khỏi dịch vụ. Ví dụ: nếu tôi muốn trả về một cái gì đó khác nhau trong các điều kiện khác nhau, tôi sẽ chuyển các đối số khác nhau cho các hàm có liên quan hoặc sử dụng một hàm khác chia sẻ trạng thái riêng tư đó.

Tôi vẫn là một người không biết gì về AngularJS vì vậy tôi chắc chắn đó chỉ là sự thờ ơ và / hoặc những thói quen xấu mà tôi đã chọn.

Câu trả lời:


219

Một trường hợp sử dụng tốt $provide.decoratorlà khi bạn cần thực hiện một "chỉnh sửa" nhỏ trên một số dịch vụ bên thứ ba / ngược dòng, mà mô-đun của bạn phụ thuộc, trong khi vẫn giữ nguyên dịch vụ (vì bạn không phải là chủ sở hữu / người bảo trì dịch vụ). Đây là một cuộc biểu tình trên plunkr.


6
Ví dụ tuyệt vời. Tôi đã thực sự tự hỏi làm thế nào để mở rộng chức năng mô-đun của bên thứ ba mà không can thiệp với họ
Arthur Kovacs

5
Các nhà trang trí có thực sự dồn tất cả các trường hợp của một dịch vụ, hoặc họ chỉ nằm trong phạm vi mô-đun trang trí chúng? Nói cách khác, giả sử tôi có mô-đun A trang trí dịch vụ từ mô-đun B. Sau đó tôi có mô-đun C phụ thuộc vào mô-đun A và mô-đun B. Bên trong mô-đun C, dịch vụ từ mô-đun B là phiên bản gốc hay được trang trí?
Jon Jaques

3
@JonJaques - Đó là một câu hỏi tuyệt vời. Tôi đã không gặp tình huống như vậy. Nếu tôi đoán, phiên bản của dịch vụ mà mô-đun C nhìn thấy phải là phiên bản được trang trí từ mô-đun A nhưng tôi không thể nói điều đó cho đến khi tôi tự thử. Tại sao bạn không viết một plunkr / jsffidle đơn giản và thử nghiệm điều đó. Sẽ thật tuyệt vời nếu bạn có thể chia sẻ phát hiện của bạn với chúng tôi. Chúc mừng.
tamakisapes

6
@JonJaques - Không thể kìm nén sự tò mò của tôi, vì vậy tôi đã thêm một vài dòng vào ví dụ ban đầu của mình để tìm câu trả lời cho câu hỏi, liên kết của bạn . Nói tóm lại, phỏng đoán trong nhận xét trước đây của tôi là đúng.
tamakisapes

17
Các nhà máy, Dịch vụ, vv là các singletons (như được cung cấp), vì vậy một khi được trang trí, luôn luôn được trang trí.
FlavorScape

66

Nhà trang trí cho phép chúng tôi tách ra các mối quan tâm xuyên suốt và cho phép các dịch vụ duy trì nguyên tắc trách nhiệm đơn lẻ mà không phải lo lắng về mã "cơ sở hạ tầng".

Sử dụng thực tế của trang trí:

  • Bộ nhớ đệm: nếu chúng tôi có một dịch vụ thực hiện các cuộc gọi HTTP có khả năng đắt tiền, chúng tôi có thể bọc dịch vụ trong một bộ trang trí bộ đệm để kiểm tra bộ nhớ cục bộ trước khi thực hiện cuộc gọi bên ngoài.
  • Gỡ lỗi / Truy tìm: có một công tắc tùy thuộc vào cấu hình phát triển / sản xuất của bạn, trang trí cho các dịch vụ của bạn bằng trình bao gỡ lỗi hoặc theo dõi.
  • Throttling: bọc các cuộc gọi được kích hoạt thường xuyên trong một trình bao bọc gây tranh cãi. Cho phép chúng tôi dễ dàng tương tác với các dịch vụ giới hạn tỷ lệ, ví dụ.

Trong tất cả các trường hợp này, chúng tôi giới hạn mã trong dịch vụ là trách nhiệm chính của nó.


10

decoratorcó thể chặn phiên bản dịch vụ được tạo bởi factory, service, value, providervà cung cấp các tùy chọn để thay đổi một sốinstance(service) không thể cấu hình / với các tùy chọn.

Nó cũng có thể cung cấp các trường hợp giả cho mục đích thử nghiệm, ví dụ $http.


1
Điều đáng chú ý là bạn cũng có thể ghi đè các directiveđịnh nghĩa như được trình bày bởi Ben Nadel
David Salamon

Dưới đây là tài liệu tham khảo trong các tài liệu Angular chính thức: https://docs.angularjs.org/guide/decorators
David Salamon

3

Nói một cách đơn giản, chúng ta có thể nói rằng nó giống như một phương thức mở rộng. Ví dụ Chúng tôi có một lớp và nó có hai phương thức và trong thời gian chạy, chúng tôi muốn thêm phương thức vào đó, sau đó chúng tôi sử dụng Decorator.

Chúng tôi không thể sử dụng $ cung cấp.decorator với các hằng số vì chúng tôi không thể thay đổi các hằng số mà chúng đang sử dụng thuộc tính chỉ đọc.


1

Trong trang trí ngắn có thể được mô tả như sau: -

Một chức năng trang trí ngăn chặn việc tạo ra một dịch vụ, cho phép nó ghi đè hoặc sửa đổi hành vi của dịch vụ.

Nó sử dụng $providedịch vụ theo góc và sửa đổi hoặc thay thế việc thực hiện dịch vụ khác

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

Thí dụ:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

Các ứng dụng

Ngoài câu trả lời @JBland.

  • Cài đặt ngôn ngữ rộng ứng dụng: -

    Bạn có thể tìm thấy một ví dụ ở đây

  • Thay đổi hành vi mặc định và triển khai dịch vụ hiện có của dịch vụ góc: -

    Bạn có thể tìm thấy một eample ở đây

  • Chuyển đổi hành vi của một chức năng trong các môi trường khác nhau.

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.