在EmberJS中,如果我想观察一个属性" selectedValue"在嵌套模型中,我该怎么做?
以下似乎不起作用;
modelChanged: function() {
}.observes('myModel.@each.@each.selectedValue'),
以下也不起作用
modelChanged: function() {
}.observes('myModel'),
这就是myModel的样子
[
[{
"prop1": "abc_1",
"selectedValue": "abc_1"
}, {
"prop1": "xyz_1",
"selectedValue": "xyz_1"
}],
[{
"prop1": "abc_2",
"selectedValue": "abc_2"
}, {
"prop1": "xyz_2",
"selectedValue": "xyz_2"
}],
[{
"prop1": "abc_3",
"selectedValue": "abc_3"
}, {
"prop1": "xyz_1",
"selectedValue": "xyz_1"
}]
]
基于
更新似乎工作......只是几个问题;
- 醇>
在上面的代码中," observeObjects"只是为这个arr [0]中的第一个外部数组和track属性添加。我有多个外部 数组元素
如何修改上述内容以跟踪多个属性?即 在某些情况下,它将被选择为值"或者它可以 " preSelectedValue"在其他情况下。它的属性取决于什么 在那个对象本身。但我需要跟踪其中任何一个的变化 selectedValue / preSelectedValue
同样在observerMethod,我能得到吗? 上下文并检查新的selectedValue / preSelectedValue是什么?
答案 0 :(得分:1)
嵌套模型的结构是什么?如果myModel是具有selectedValue的元素数组,则可以使用myModel.@each.selectedValue
。如果您需要多级嵌套,则不支持开箱即用。
请注意@each只能深入一级。您不能使用嵌套表单,如todos。@ each.owner.name或todos。@ each.owner。@ each.name。
有一些解决方法取决于您的模型结构,如果您使用您的结构回复或更新问题,我将更新我的答案以涵盖适当的解决方案。
更新:根据myModel
的设置/更新方式,您可能需要调整调用observeMyModelChildren
的时间以及创建观察者的方式。
// observerMethod is called when myModel.@each.@each.selectedValue changes
observerMethod: function () {
// handle change
},
// observedObjects tracks child observers so they can be removed
observedObjects: [],
// observeMyModelChildren listens for changes to myModel, removes
// old observers, and adds new ones
observeMyModelChildren: function () {
const key = '@each.selectedValue';
this.get('observedObjects').forEach((el) => {
el.removeObserver(key, this, this.observerMethod);
});
this.set('observedObjects', []);
let observedObjects = [];
this.get('myModel').forEach((el) => {
el.addObserver(key, this, this.observerMethod);
observedObjects.pushObject(el);
});
this.set('observedObjects', observedObjects);
}.observes('myModel'),
更新2 :如果您想支持观察多个属性(例如其他模型),您可以通过修改observeMyModelChildren
来执行此操作:
observePropertyChildren: function (obj, attr) {
console.log('setting up observers on', attr);
var key = 'observedObjects.' + attr;
var observedObjects = this.get(key) || [];
observedObjects.forEach((el) => {
el.removeObserver('@each.selectedValue', this, this.observerMethod);
});
this.get(attr).forEach((el) => {
el.addObserver('@each.selectedValue', this, this.observerMethod);
observedObjects.pushObject(el);
});
this.set(key, observedObjects);
}.observes('myModel', 'myOtherModel'),