2016-04-06 27 views
5

Tôi cần một số làm rõ về ràng buộc giữa dịch vụ và thành phần thuộc tính và dữ liệu ràng buộc trong angular2dữ liệu angular2 ràng buộc giữa dịch vụ và thành phần thuộc tính

giả tôi có một dịch vụ (singleton) và một thành phần

export class Service { 
name = "Luke"; 
object = {id:1}; 
getName(){return this.name}; 
getObject(){return this.object}; 
} 

export class Component implements OnInit{ 
name:string; 
object:any; 
constructor(private _service:Service){} 
ngOnInit():any{ 

    //Is this 2 way binding? 
    this.name = this._service.name; 
    this.object = this._service.object; 

    //Is this copying? 
    this.name = this._service.getName(); 
    this.object = this._service.getObject(); 
    } 
} 

Trả lời

5

Nếu bạn cập nhật các yếu tố bằng cách tham khảo (nếu bạn cập nhật một cái gì đó vào object tài sản), bạn sẽ thấy những thông tin cập nhật trong giao diện:

export class Service { 
    (...) 

    updateObject() { 
    this.object.id = 2; 
    } 
} 

Nếu bạn cập nhật các yếu tố theo giá trị (nếu bạn cập nhật một cái gì đó vào name tài sản), bạn sẽ không thấy các bản cập nhật trong giao diện:

export class Service { 
    (...) 

    updateName() { 
    this.name = 'Luke1'; 
    } 
} 

xem plunkr này: https://plnkr.co/edit/w7bS0fAVjOc3utnpD39b?p=preview.

+0

tôi thấy, bởi vì trong trường hợp đầu tiên ive tạo ra hai tài liệu tham khảo chỉ về phía cùng một đối tượng, trong khi dưới đây tôi sẽ net để "sao chép" tài sản một lần nữa? –

+0

nhưng chờ đợi, có nghĩa là nếu tôi có một kiểu dữ liệu tham chiếu trong một dịch vụ Singleton, và tạo tham chiếu mới trỏ về phía nó trong các thành phần khác nhau, chế độ xem sẽ tự động cập nhật mỗi khi tôi thay đổi nó ?? –

+1

@HanChe, vâng, các chế độ xem sẽ tự động cập nhật vì tất cả các liên kết mẫu của bạn đều bị ràng buộc vào cùng một đối tượng.Tất cả các thành phần của bạn đều có tham chiếu riêng, nhưng tất cả đều trỏ tới cùng một dịch vụ Singleton, và sau đó tất cả các ràng buộc mẫu có tham chiếu riêng của chúng, nhưng tất cả đều trỏ đến cùng một đối tượng trong Singleton đó. Vì vậy, nó tất cả các công trình. –

6

kiễu góc ràng buộc chỉ hoạt động cho các ràng buộc được khai báo trong dạng xem (HTML).

Nếu bạn muốn các thuộc tính trong thành phần của bạn được cập nhật khi các giá trị trong một dịch vụ thay đổi, bạn cần tự chăm sóc nó.

Quan sát làm cho việc này trở nên dễ dàng. Xem detect change of nested property for component input để biết ví dụ.

+0

Hi Günter, cảm ơn cho trả lời của bạn và có tôi trên các quan sát, nhưng trong trường hợp này.name = this._service.name; nó làm gì, nó chỉ là một bản sao đơn giản? –

+0

Có nó sao chép giá trị khi 'ngOnInit()' được gọi. Ví dụ, nếu dịch vụ thu thập dữ liệu từ một máy chủ từ xa bằng cách sử dụng một yêu cầu HTTP, thì có thể chưa có một giá trị trong 'this.service.name'. Nếu sau này dịch vụ nhận được phản hồi từ máy chủ thì thành phần đó sẽ không nhận được giá trị mới. –

+0

ngOnInit() chỉ là một ví dụ, nhưng sau đó điều gì sẽ khác biệt giữa việc sử dụng this.service.name và this.service.getName()? Nó giống như trong java nếu tôi tuyên bố tên là tư nhân trong dịch vụ để bảo vệ nó và sử dụng getters và setters? –

0

Nếu bạn muốn tính trong một bản cập nhật phần càng sớm càng có giá trị trong sự thay đổi trong một thay đổi dịch vụ:

  1. nhập DoCheck từ @angular/coreservice của bạn vào các thành phần .
  2. Gọi chức năng dịch vụ ảnh hưởng đến tài sản thành phần trong ngDoCheck(){...}
  3. Quan điểm thành phần sẽ được cập nhật tự động càng sớm càng bất kỳ thay đổi

Something như thế này trong thành phần của bạn:

ngDoCheck() { 
    this.qty = this.cartService.getTotalQtyInCart(); 
    } 
Các vấn đề liên quan