Data binding 服务和组件属性之间的angular2数据绑定

Data binding 服务和组件属性之间的angular2数据绑定,data-binding,angular,angular2-services,two-way,Data Binding,Angular,Angular2 Services,Two Way,我需要澄清angular2中服务和组件属性之间的绑定以及数据绑定 假设我有一个服务(单例)和一个组件 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; const

我需要澄清angular2中服务和组件属性之间的绑定以及数据绑定

假设我有一个服务(单例)和一个组件

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();
  }
}

角度绑定仅适用于视图(HTML)中声明的绑定

如果您希望在服务中的值更改时更新组件中的属性,则需要自己处理


可见光使这变得容易。有关示例,请参见。

如果通过引用更新元素(如果将某些内容更新到
对象
属性中),您将在视图中看到更新:

export class Service {
  (...)

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

  updateName() {
    this.name = 'Luke1';
  }
}
如果按值更新元素(如果将某些内容更新到
name
属性中),则不会在视图中看到更新:

export class Service {
  (...)

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

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

如果希望组件中的属性在服务中的更改值发生更改时立即更新,请参阅以下内容:。

  • DoCheck
    @angular/core
    导入到 组成部分
  • ngDoCheck(){…}
  • 一旦发生任何更改,组件视图将自动更新
  • 在您的组件中类似于以下内容:

      ngDoCheck() {
        this.qty = this.cartService.getTotalQtyInCart();
      }
    

    您好,甘特,谢谢您的回复,是的,我是在observables上,但在这种情况下。name=this。_service.name;它是做什么的,那么它只是一个简单的副本吗?是的,当调用
    ngOnInit()
    时,它只复制一次值。例如,如果服务使用HTTP请求从远程服务器获取数据,则
    this.service.name
    中可能还没有值。如果服务稍后收到来自服务器的响应,则组件不会获得新值。ngOnInit()只是一个示例,但是使用this.service.name和this.service.getName()有什么区别?如果我在服务中将名称声明为private以保护它并使用getter和setter,这与java中的情况类似吗?这只取决于
    service.name
    service.getName()
    返回的内容。从属性或方法返回的值被分配给
    this.name
    ,仅此而已。不涉及任何角度。这正是TypeScript所做的。我明白了,因为在第一种情况下,我创建了两个指向同一对象的引用,而在下面的情况下,我将再次“复制”该属性。但是,等等,这是否意味着如果我在服务单例中有一个引用数据类型,并在各种组件中创建指向它的新引用,每次我更改视图时,视图都会自动更新???@HanChe,是的,视图都会自动更新,因为所有模板绑定都绑定到同一个/一个对象。所有组件都有自己的引用,但它们都指向同一个单例服务,然后所有模板绑定都有自己的引用,但它们都指向该单例中的同一对象。所以一切都很好。@MarkRajcok谢谢!但这是用来保存的吗?有什么大的陷阱吗?