余烬观察嵌套模型属性
Ember observe nested model property
在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"
}]
]
基于
更新似乎正在工作…只是几个问题;
在上面的代码中,"observedObjects"只是添加了第一个外部数组,并在这个arr[0]中跟踪属性。我有多个外层数组元素
我如何修改上述跟踪多个属性?即。在某些情况下,它可能是"selectedValue",也可能是在其他情况下为preSelectedValue。这是什么性质要看情况了在那个物体本身上。但我需要跟踪两者的变化selectedValue/preSelectedValue
同样在observerMethod中,我可以得到一个上下文并检查新的selectedValue/preSelectedValue是什么?
嵌套模型的结构是什么?如果myModel是一个具有selectedValue的元素数组,则可以使用myModel.@each.selectedValue
。如果你需要多层嵌套,那是不支持开箱即用的。
来自文档:
注意@each只作用于一个层次。您不能使用嵌套的表单,如todos.@each.owner.name或todos.@each.owner.@each.name。
有一些变通方法取决于你的模型结构,如果你用你的结构回答或更新问题,我将更新我的答案以涵盖适当的解决方案。
Update:根据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'),
- 使用导航属性创建Kendo UI网格模型的问题
- 将输入值设置为ng模型属性[Angular]时出现问题
- 如何使用Undercore和Backbone在HTML中表示模型属性
- 主干中的模型属性未定义
- ng重复中的ng模型-初始化唯一作用域属性
- sails.js beforeCreate方法只接收required设置为true的模型属性
- 如何使用javascript访问sails.js模型中的属性
- 如何更改与Backbone集合中的模型相关联的几个元素的css属性
- 从骨干集合筛选模型,然后为这些模型设置属性
- Ember.js:未在组件'中渲染的模型的计算属性;关于变更的参考
- 当ng repeat上的复选框具有必需的属性时,角度ng模型将变为未定义
- 将属性模型复制到剪贴板
- Backbone JS Promises在模型上设置属性之前解析
- 比较主干中的两个模型属性
- 在ember.js中访问模型之外的计算属性
- 如何在sails.js中更改属性模型中的日期格式
- 如何使用setVisible()方法设置json模型中元素的可见属性
- MVC6将视图模型列表属性分配给javascript变量
- 更新淘汰视图模型属性时激发更改事件
- angularJS + 猫鼬: 类型错误: 无法读取未定义的属性“模型”