model.getProperty()是否为作为数组成员的对象返回活动对象?

时间:2016-11-18 15:47:24

标签: sapui5

我从模型中的数组(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)

完成第二次编辑以完成未来读者的三种方法。

1 个答案:

答案 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对象:)