更新:我最终使用了访问模型并在设置器中调用外部更改跟踪的属性。
get text(): string {
return model.text
}
set text(value: string) {
// <-- Call the change tracker here
this.model.text = value;
}
原始问题
我有一个使用 AngularJS 编写的系统,我需要从外部跟踪每个模型的变化(跟踪脏)。在 AngularJS 中,为每个模型的属性(包括数组内元素属性的更改)添加观察者很简单。注意:模型用作 UI 组件的数据。
数据流是这样的:
- SPA 从服务器请求数据。
- 服务器获取数据。
- 在返回数据之前,会在每个模型的属性中添加一个观察者。
- 观看的模型返回到 SPA。
这是监视更改的主要代码:
public attachModel(obj : any, id : string, scope: ng.IScope, propertyName: string) {
var idObj = obj.Id;
this.attachedObjs[obj.Id] = obj; // Just keeping control of tracked objs
var that = this;
// The 'id' used in the watch is unique for the tracked property
scope.$watch(id, function () {
that.changeTracker(idObj, propertyName); // Calls dirty tracking
});
}
每次更改任何模型中的属性时,都会触发一个事件,并且模型的属性在外部更改控制中被标记为脏。
我正在尝试在新的 Angular 中找到此功能的替代品,但我觉得我没有走在正确的道路上,我目前拥有的唯一选择是:
- 使用类似 RxJS
Do
的方法来调用脏跟踪。 - 使用 ngrx Observables 并添加 @Effects 来触发脏跟踪。
一件重要的事情是,在 AngularJS 中,我有一个点,所有模型都被添加到脏跟踪控制中。
有没有办法在 Angular 中实现这一点?还是一种拦截 Angular 的变更检测以触发脏跟踪的方法?
注意:我发现了一个在我最初的搜索过程中不知何故错过的问题,有没有办法在 ngForm 之外实现这一点?如何观察 Angular 2 中的表单变化?