2016-11-07 17 views
7

Tôi đang tìm cách tốt nhất để xử lý HostBinding với giá trị không đồng bộ.Async HostBinding trong chỉ thị

Trước kiễu góc v2.1.2 tôi có thể sử dụng tài sản host trong trang trí @Directive như thế:

@Directive({ 
    selector: 'img[my-directive]', 
    host : { 
     '[alt]' : "alt | async" 
    } 
}) 
export class MyDirective { 
    alt: Observable<string>; 
} 

Nhưng có vẻ như đây không phải là hành vi dự kiến, kể từ phiên bản 2.1.2 sửa lỗi nó. Xem don't access view local variables nor pipes in host expressions.

Bây giờ, khi biên soạn với trình biên dịch AoT, tôi nhận được Parser Error: Host binding expression cannot contain pipes in Directive.

+0

sở hữu máy chủ gì bạn đang cố gắng để ràng buộc vào? Bạn có thể cung cấp cho chúng tôi mã của phần tử máy chủ không? –

+0

Phần tử máy chủ lưu trữ là một '' gốc. Tôi muốn 'MyDirective' liên kết không đồng bộ giá trị của thuộc tính' alt' có thể quan sát được với thuộc tính 'alt' img. –

+1

"... chúng tôi không bao giờ muốn có đường ống trong các ràng buộc máy chủ." Nguồn: [Liên kết máy chủ không đồng bộ không còn hoạt động 12671] (https://github.com/angular/angular/issues/12671#issuecomment-258168242) Vì vậy, bạn nên tìm cách khác để thực hiện việc này hoặc cập nhật câu hỏi của mình. –

Trả lời

3

Tobias Bosch (thành viên của nhóm kiễu góc) viết:

chủ bindings của một thành phần ("con") được thực hiện trong thành phần sử dụng thành phần đó ("cha mẹ"). Và thành phần gốc có thể thuộc về một NgModule khác. Vì vậy, nếu bạn sử dụng một đường ống, đường ống là được giải quyết chống lại NgModule của thành phần gốc. Tuy nhiên, nếu rằng NgModule không khai báo đường ống mà bạn đang sử dụng, thành phần của bạn bị hỏng.

Đây là lý do tại sao chúng tôi không bao giờ muốn có đường ống trong các ràng buộc máy chủ. Sau một trong các phép tái cấu trúc trình biên dịch lớn hơn trước 2.0, chúng tôi vô tình giới thiệu lại, nhưng đây là lỗi, không phải là một tính năng, như là ngữ nghĩa là sai.

Nguồn:

Async Host Binding No Longer Works #12671

1

Tôi chắc chắn không có cách nào đặc biệt để làm điều đó. Bạn cần phải gán một cách rõ ràng đến tài sản

@Directive({ 
    selector: 'img[my-directive]', 
    host : { 
     '[alt]' : "alt" 
    } 
}) 
export class MyDirective { 
    alt: Observable<string>; 

    ngOnInit() { 
     this.altObservable.subscribe(val => this.alt = val) 
    } 
} 
+0

Đây là cách tôi đang thực hiện ngay bây giờ. Tuy nhiên, tôi đã hy vọng chúng tôi vẫn có thể sử dụng 'AsyncPipe' bởi vì nó có nhiều hơn chỉ là một' đăng ký'. Nhưng cảm ơn bạn :) –

+0

Ống bên ngoài khuôn mẫu không bao giờ phải làm việc. (có lẽ trong một số thời điểm tiền beta). Tôi tìm thấy nó interresting rằng nó làm việc cho đến gần đây. –

+0

Tôi chưa bao giờ thử nó trước v2.1.0, sau đó v2.1.2 xóa nó –

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