【发布时间】: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/getmetadata对象本身。但是languages[0]项。 -
@Abdulrahman true 无法反驳这一点,但这不是我困惑的根源。它如何仅更改 currentItem 或.. 此外,RestoreService 如何提供该功能?
标签: javascript typescript angular