2015-12-07 18 views
29

Tôi có chỉ thị và trên đó là một số @Input chấp nhận một lớp.Trong angular2, cách nhận được cácThay đổi đối với các thuộc tính được thay đổi trên một đối tượng được gửi cho một @Input

@Directive({selector: 'my-directive'}) 
@View({directives: [CORE_DIRECTIVES]}) 
export class MyDirective { 
    @Input() inputSettings : SettingsClass; 
    @Input() count : number; 

    onChanges(map) { 
     console.log('onChanges'); 
    } 
} 

Chỉ thị được sử dụng trong html:

... 
    <my-directive [input-settings]="settings" [count]="settings.count"></my-directive> 
    ... 

Nếu settings.count được thay đổi thì onChanges sẽ cháy. Nếu bất kỳ thuộc tính nào khác trên lớp cài đặt thay đổi, thì nó sẽ không kích hoạt.

Làm cách nào để phát hiện xem có thay đổi đối với bất kỳ thuộc tính nào trên cài đặt không?

+0

tôi đoán được này (hiện tại?) không hoạt động ... có thể vì 'inputSettings' chứa tham chiếu đến một đối tượng của một đối tượng và vì tham chiếu không thay đổi, Angular có thể không cố so sánh các thuộc tính đối tượng để nó không nhìn thấy hoặc báo cáo thay đổi. (Tôi hy vọng tôi sai, hoặc tôi hy vọng họ sửa lỗi này.) –

+0

Thật vậy, [bài đăng trên blog của Victor Savkin] (http://victorsavkin.com/post/133936129316/angular-immutability-and-encapsulation) đã xác nhận các giả định của tôi: "Nếu đối tượng địa chỉ có thể thay đổi, một số thành phần khác có thể cập nhật thuộc tính đường phố mà không cần tạo đối tượng địa chỉ mới. Nếu điều này xảy ra, hook onChanges sẽ không được gọi". –

+0

bạn cũng có thể sử dụng getter và setter cho thuộc tính đầu vào thuộc tính – Ayyash

Trả lời

46

góc sẽ chỉ nhận thấy nếu đối tượng đã được thay đổi đến một đối tượng khác nhau (ví dụ, các tham chiếu đối tượng thay đổi), vì vậy không thể sử dụng ngOnChanges() để giải quyết sự cố của bạn. Xem Victor Savkin's blog post để biết thêm thông tin.

Bạn có thể triển khai phương thức ngDoCheck() trong lớp MyDirective của mình. Vòng đời đó được gọi là "mỗi khi các thuộc tính đầu vào của một thành phần hoặc một chỉ thị được chọn. Hãy sử dụng nó để mở rộng phát hiện thay đổi bằng cách thực hiện kiểm tra tùy chỉnh".

Để thực hiện phương pháp kiểm tra tùy chỉnh của bạn, trước tiên bạn sẽ cần phải thực hiện một phương pháp .equals() trên lớp SettingsClass như vậy mà bạn sau đó có thể viết mã một cái gì đó như sau trong ngDoCheck():

ngDoCheck() { 
    if(!this.inputSettings.equals(this.previousInputSettings)) { 
     // inputSettings changed 
     // some logic here to react to the change 
     this.previousInputSettings = this.inputSettings; 
    } 
} 
-4

Trong html của bạn, bạn không thể sử dụng CamelCase, thay đổi nó để

<my-directive [input-settings]="settings" [count]="settings.count"></my-directive>

+0

Bắt tốt, nhưng điều đó không gây ra các OnChang không cháy. Tôi chỉ cần gõ sai trong ví dụ. – Peter

+5

Hiện đã lỗi thời. Vì các thuộc tính alpha.52 trong các mẫu phân biệt chữ hoa chữ thường. –

+0

Thật vậy, HTML của Angular phân biệt chữ hoa chữ thường mặc dù bản thân HTML không được phân biệt chữ hoa chữ thường. Góc bị chỉ trích vì điều này. Điều này cũng gây nhầm lẫn. – Gherman

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