更新: 我最终使用了访问模型并在 setter 内部调用外部更改跟踪的属性。
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 可观察量并添加@Effects以触发脏跟踪。
一件重要的事情是,在 AngularJS 中,我有一个点,所有模型都被添加到脏跟踪控制中。
有没有办法在 Angular 中实现这一目标?或者一种拦截 Angular 的变化检测以触发脏跟踪的方法?
注意:我在初次搜索时发现了一个不知何故错过的问题,在ngForm之外有什么方法可以实现这一点吗?如何观察 Angular 2 中的表单变化?
如果要跟踪的模型是角度形式的表单输入,则可以侦听 valueChanges 流。