2016-01-04 32 views
6

Tôi đang cố gắng để hiểu được sự cần thiết của việc thêm các @Injectable() trang trí trong các dịch vụ trong góc 2.góc 2 @Injectable() - làm thế nào nó hoạt động

Từ các tài liệu: https://angular.io/docs/ts/latest/guide/dependency-injection.html

Tại sao don' t chúng ta thêm @Injectable() vào HeroesComponent? Chúng ta có thể thêm nó nếu chúng ta thực sự muốn. Không cần thiết vì HeroesComponent đã được trang trí với @Component. TypeScript tạo siêu dữ liệu cho bất kỳ lớp nào bằng trình trang trí và bất kỳ công cụ trang trí nào cũng sẽ thực hiện.

Vì vậy, về cơ bản bạn chỉ cần thêm @Injectable() nếu không có trang trí khác có sẵn, bởi vì nếu có một trang trí của bất kỳ loại có sẵn, trình biên dịch nguyên cảo sẽ tự động tạo ra sự phụ thuộc thông tin dựa trên các biến mà bạn thông qua trong constructor ví dụ .: constructor(private logger: Logger)

Điều này có đúng không? Cảm ơn

+5

Điều này đúng .. – alexpods

+5

Tôi lol'd @alexpods. Điều gì về việc thêm nó như là một câu trả lời: D? Để bổ sung một chút, bạn có thể đọc [bình luận] này (https://github.com/angular/angular/issues/4404#issuecomment-143920530), toàn bộ vấn đề thú vị, nhưng không hoàn toàn liên quan đến câu hỏi của bạn. –

Trả lời

7

Tôi nghĩ tên đó hơi lạ và tôi thực sự không hiểu tại sao họ yêu cầu bạn thêm nó để thực hành tốt nhất. Nếu thêm nó vào mỗi lớp là thực hành tốt nhất, tôi không hiểu tại sao nó lại cần thiết. Nó sẽ dễ dàng hơn để có khuôn khổ kiểm tra tất cả các lớp nếu các nhà xây dựng cần công cụ tiêm hay không. Điều này có thể đã được giải quyết với một thuộc tính dòng lệnh trên bản ghi để luôn tạo ra siêu dữ liệu (mô phỏng).

Lời khuyên để luôn thêm nó, tôi đoán tương tự như trình biên dịch luôn thêm siêu dữ liệu (không thể theo như tôi biết). Bạn cũng có thể (với cảnh giác) chỉ (và luôn luôn) thêm nó vào các lớp học mà cần công cụ tiêm - ngay cả khi họ có một trang trí. Đó có thể là giải pháp rõ ràng nhất - nhưng hey - bị cẩu thả có thể vừa là điều xấu vừa là điều tốt. Bạn sẽ là thẩm phán trong trường hợp này.

TL; DR Nếu bạn có không trang trí khác bạn nếu constructor của bạn cần dịch vụ/etc tiêm, sau đó bạn cần nó.

+1

Để làm rõ, không cần thiết cho các lớp có các trang trí lớp khác mở rộng từ 'Injectable' (' Component', etc) ** hoặc ** cho các lớp có thuộc tính hàm tạo của chúng được chú thích bằng 'Tiêm' (ví dụ: trong ES.next mã). – estus

Các vấn đề liên quan