【问题标题】:Angular2 documentation - Hierarchical Dependency Injectors ( Restore Service )Angular2 文档 - 分层依赖注入器(恢复服务)
【发布时间】:2016-04-12 11:33:10
【问题描述】:

这是初学者的问题.. 我一直在阅读 Angular2 文档,我在 使用恢复服务的分层依赖注入器章节 使保存/取消功能可用于编辑。

这是服务:

export class RestoreService<T> {
   originalItem: T;
   currentItem: T;
 setItem (item: T) {
   this.originalItem = item;
   this.currentItem = this.clone(item);
 }
 getItem () :T {
   return this.currentItem;
 }
 restoreItem () :T {
   this.currentItem = this.originalItem;
   return this.getItem();
 }
 clone (item: T) :T {
   return JSON.parse(JSON.stringify(item));
 }
}

我对此感到非常兴奋,所以我自己尝试了! 首先,我设置这样的值:

ngAfterContentInit(){
     this.metadata = {
      languages: this.selected_languages,
      countries: this.selected_countries,
      international: false
     }
 }
 set metadata(metadata: CvMetadata){
      this._restoreService.setItem(metadata);
 }
 get metadata(): CvMetadata{
    return this._restoreService.getItem();
 }

之后,我将使用 ngModel 更改 元数据 属性值 例如:[(ngModel)]="metadata.languages[0]"

问题:
令我惊讶的是,当我使用 ngModel 更新 metadata 属性值时,它可以工作 - currentItem 已更改,而 orginalItem 没有!我不明白这怎么可能?我认为 ngModel 会使用 setter 来设置 metadata 属性。但是当我设置原始数据时,setter 只被调用一次。 ngModel 怎么知道它应该只改变 currentItem 而不是 originalItem? 这是黑魔法吗?

我知道..我只需要有人解释一下,但不幸或幸运的是只有你们!

谢谢!

【问题讨论】:

  • ngModel 不是 set/get metadata 对象本身。但是languages[0] 项。
  • @Abdulrahman true 无法反驳这一点,但这不是我困惑的根源。它如何仅更改 currentItem 或.. 此外,RestoreService 如何提供该功能?

标签: javascript typescript angular


【解决方案1】:

RestoreService:它有两个函数settergetter

setItem (item: T) 设置originalItem,克隆它并将克隆保存到currentItem

getItem() 只返回currentItem(克隆项目)

现在,ngModel 获取项目 metadata 以获取其属性 languages。所以它会得到currentItem。当ngModel 设置一个新的属性值时,它不需要set metadata()。它只需要在metadata 中设置languages 属性。因此,它将再次获得metadata 并设置languages 属性。

Here is a plunker希望对您有所帮助

另一种解释方式:

this.metadata = {language:['english']}; // you set metadata, effectively setting originalItem and cloning it to currentItem

this.metadata.languages = ['arabic'];  // you get metadata "currentItem", set its property languages. Never actually setting metadata itself

clone 函数注意事项:RestoreService 中的函数clone 没有以“实用”的方式克隆对象。因为它使用 JSON 解析器。有关更多详细信息和更好的克隆方法,请参阅这些问题:122102728360

【讨论】:

  • 我刚刚测试过,你是对的!这是它令人困惑的部分......“使用 getter 设置东西”,但当我想到它时,它现在非常有意义。再次感谢您的解释!
  • @ChakijsTerzētājs 非常欢迎您。我很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2017-09-26
  • 2014-02-25
  • 2020-05-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多