Ember观察嵌套模型属性
问题描述:
在EmberJS中,如果我想观察一个嵌套模型中的属性“selectedValue”,我该怎么做?Ember观察嵌套模型属性
下面似乎没有工作;
modelChanged: function() {
}.observes('[email protected]@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"
}]
]
更新基于
似乎是工作...只是一对夫妇问题;
在上面的代码中, “observedObjects” 只是增加了对所述第一外部阵列和这种ARR内跟踪属性[0]。我有多个外层 阵列元素
如何修改上述内容以跟踪多个属性?即 在某些情况下,它将是“selectedValue”,或者在其他情况下可以是 “preSelectedValue”。该物体本身的属性取决于 。但我需要在observerMethod跟踪要么 了selectedValue的变化/ preSelectedValue
而且,我可以得到 上下文并检查新了selectedValue/preSelectedValue是什么?
答
什么是你的嵌套模型的结构?如果myModel是具有selectedValue的元素数组,则可以使用[email protected]
。如果您需要多层嵌套,那么不支持开箱即用。
注意@each只能深一个层次。你不能使用像todos这样的嵌套表单。@ each.owner.name或todos。@ each.owner。@ each.name。
有一些解决方法取决于您的模型结构,如果您回答或更新结构中的问题,我会更新我的答案以涵盖适当的解决方案。
更新:根据myModel
是如何设置/更新,你可能需要调整时observeMyModelChildren
被称为以及如何创建观察员。
// observerMethod is called when [email protected]@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'),
非常感谢。我用我的模型结构更新了这个问题。正如你所看到的,它有一个嵌套/复杂的数组结构类型,我想追踪它里面的“selectedValue” – testndtv
请让我知道你是否需要额外的信息 – testndtv
已更新。让我知道如果你有任何问题 – maffews