2016-11-18 78 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