我从模型中的数组(JSONmodel类型)中获取了一个对象,该对象是
{
"task": [
{
"dbid": 465,
"bk_cnt": 11,
}, {
"dbid": 472,
"bk_cnt": 16,
}
]
}
我将此模型绑定到表并将bk_cnt连接到单元格中的objectNumber。到目前为止没问题。
在代码中我想按一个按钮将第一个bk_cnt值的值从11改为20。在活动中我有:
var model = this.getView().getModel() // get the model
var tasks = model.getProperty("/task"); // get as a JS object
tasks[0].bk_cnt = 20 // update the model...will it update the view?
// model.refresh() // it will if this is uncommented.
问题:虽然它绑定到视图,但bk_cnt的显示值不会改变。如果我添加model.refresh()它。此代码从较大的部分中提取,其中一个较大的功能是按列单击进行排序。当我单击一列重新排序(不更改模型)时,将显示值20.
是什么给出了?
Musings:我已经读过,model.getProprty()函数返回一个带有实时引用的javascript对象回到模型,并且对象值的更改将自动反映在视图中任何绑定控件。这个陈述是否属于数组属性?
编辑:我仍然感觉到这个问题,我发现
model.setProperty("/task/0/bk_cnt", 20)
不需要model.refresh()来更新视图。这个命令直接通过模型起作用并不令人惊讶。这让我想到了“活着”。 getProperty()返回的对象仅在它是一个原始数据类型(如字符串或整数)时生效,但不适用于JS对象。或者我错过了什么?
编辑2:@Ash在他的回答中指出还有一种方法是从模型属性访问JS对象,设置需要在JS对象中更新的属性,然后将其替换为模型,例如
var tasks = model.getProperty("/task");
tasks[0].bk_cnt = 20
model.setProperty('/task', tasks)
完成第二次编辑以完成未来读者的三种方法。
答案 0 :(得分:1)
Model对象是javascript对象ON TOP的抽象层。无法在任何地方通知对象内的更改。您需要通过model.refresh()或model.setProperty()显式触发通知。
所以你的两个解决方案都是有效的,另一个(我赞成)将是
var tasks = model.getProperty("/task");
tasks[0].bk_cnt = 20
model.setProperty('/task', tasks)
但这实际上取决于您如何将模型绑定到UI对象:)