2016-11-18 85 views
0

我得到一个对象从一个阵列中在我的模型(一个JSONmodel类型),其是model.getProperty()是否为数组成员的对象返回活动对象?

{ 
    "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出现。

什么给?

冥想:我读过model.getProprty()函数返回一个带有活动引用的javascript对象,返回到该模型,并且该对象的值的更改将自动反映在视图中以进行任何绑定控制。这个陈述落在数组属性上吗?

编辑:我周围发现

model.setProperty("/task/0/bk_cnt", 20) 

不需要model.refresh()来更新视图中的问题仍然感觉。这并不令人惊讶,因为这个命令直接通过模型行事。这让我认为getProperty()返回的'live'对象只有在它是一个像字符串或整数这样的基本数据类型时才有效,而不是JS对象。或者我错过了什么?

编辑2:@Ash在他的回答中指出,还有一种方法是从模型属性访问JS对象,设置需要在JS对象中更新的任何属性,然后将其替换为模型,例如

var tasks = model.getProperty("/task"); 
tasks[0].bk_cnt = 20 
model.setProperty('/task', tasks) 

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

回答

1

Model对象是一个JavaScript对象的抽象层ON TOP。在任何地方都无法通知对象内的更改。您需要通过model.refresh()或model.setProperty()显式触发通知。

因此,无论您的解决方案是有效的,另外一个(我赞成)将

var tasks = model.getProperty("/task"); 
tasks[0].bk_cnt = 20 
model.setProperty('/task', tasks) 

但其实这取决于你如何模型绑定到你的UI对象:)

+0

我如何将我的模型绑定到UI对象?在这种情况下,我使用了一个表格,并且在XML视图中将'items'属性设置为'{path:'/ task'}'。还有另一种绑定方式吗? –

+0

除非没有其他参数,否则您可以使用{/ task}并省略路径。当然,你可以通过编程来绑定。 – matbtt

+0

'model.refresh()'将刷新该模型的所有绑定。刷新绑定意味着使用模型中的Javascript对象的当前值更新控件。 'model.setProperty()'当然会改变模型中的Javascript对象,并且更新全部绑定到相同的路径或子路径。出于性能考虑,您必须考虑:如果只有一行数据发生更改,则不必刷新所有行。 – schnoedel