【发布时间】:2016-11-02 22:59:26
【问题描述】:
我正在尝试编写一些代码来检测对复杂嵌套分层对象的更改。我希望 $watch 或 $watchCollection 表达式就足够了,但事实证明这很难实现。
有人可以提出解决问题的好方法吗?
我要查看的数据结构的一个示例是(在 json 中):
{
"$type":"<>f__AnonymousType7`2[[System.String, mscorlib],[System.Object, mscorlib]], VM.ConfigurationServer",
"Name":"DevelopmentEnvironment",
"Descendents":{
"$type":"<>f__AnonymousType7`2[[System.String, mscorlib],[System.Object, mscorlib]][], VM.ConfigurationServer",
"$values":[{
"$type":"<>f__AnonymousType7`2[[System.String, mscorlib],[System.Object, mscorlib]], VM.ConfigurationServer",
"Name":"MoreSpecificEnvironment",
"Descendents":{
"$type":"<>f__AnonymousType7`2[[System.String, mscorlib],[System.Object, mscorlib]][], VM.ConfigurationServer",
"$values":[{
"$type":"<>f__AnonymousType7`2[[System.String, mscorlib],[System.Object, mscorlib]], VM.ConfigurationServer",
"Name":"level3",
"Descendents":null
}]
}
}]
}
}
如您所见,Json Serializer 的 TypeNameHandling 设置为 All,这对于系统的其他部分是必需的。
我需要注意的是对任何嵌套对象上的Name 属性的任何更改,以及添加或删除Descendent。
我都试过了
scope.$watch(<objectname>, function(){...}, true); 和
scope.watchCollection(<objectname>, function(){...}, true);
两者都检测到顶级 Name 和 Descendents 属性的更改,但没有检测到进一步嵌套的对象。
根据我的理解,这表明angular.equals 函数没有注意到顶层以下的变化。
有没有办法注入自定义相等比较器?
有没有办法动态更改watchExpression?因此对层次结构中的每个对象应用监视,并且随着层次结构的变化改变watchExpression
【问题讨论】:
标签: javascript angularjs json