【发布时间】:2016-11-11 18:36:24
【问题描述】:
假设我有以下 Angular 2 组件,其中 foo 是一个未绑定到表单的对象,并且不是来自 Input():
@Component({
selector: 'foo',
templateUrl: '/angular/views/foo.template.html',
directives: [ContentEditableDirective, ROUTER_DIRECTIVES],
providers: [FooService]
})
export class FooComponent implements OnInit {
public foo: Foo = new Foo();
constructor(
private fooService: FooService,
private route : ActivatedRoute,
private router : Router) {}
ngOnInit() {
let id = +this.route.snapshot.params['id'];
this.fooService.getFoo(id).subscribe(
foo => {
this.foo = foo;
// I have this.foo, we should watch for changes here.
Observable. // ???
.debounceTime(1000)
.subscribe(input => fooService.autoSave(this.foo));
},
error => console.log(error)
);
}
}
如何订阅Foo 对象的更改并将其发送到我的服务器?
到目前为止,我看到的每个示例都涉及使 foo 脱离 Input() 或绑定到表单。我只是想观察一个普通的旧 Javascript 对象的变化并对此做出反应。
更新
我再次尝试,并且已经能够对组件 here 的内部 primitive 属性进行去抖动。
但是,我无法使用具有自身属性的复杂对象 (here);因为ngModel 在更新foo 对象的属性时不会调用提供的plnkr 中的setter。
正确的答案将证明这一点适用于复杂的对象。
更新 2
I believe I have it working with a complex object;但是必须确保对象是不可变的,并且每个属性都有设置器,这有点令人失望。它似乎还需要将[(ngModel)] 拆分为[ngModel] 和(ngModelChange),以便您可以指定自定义设置器逻辑。
理论上,您可以将功能抽象为状态服务,但我想看看是否可以进一步减少样板的数量。每次想要更改状态时都创建新对象有点令人沮丧。
【问题讨论】:
-
在这里使用 angular2 区域可能会有所帮助,您可以挂接到该区域并在每次执行新的异步操作时调用您的代码,实际上是异步操作,如事件、https、超时等。这正是 angular2 在这些异步操作可以更改属性的假设下运行更改检测的时候。很好的切入点是:blog.thoughtram.io/angular/2016/02/01/zones-in-angular-2.html,告诉我这个帮助或者如果您需要更多详细信息
标签: typescript angular observable