2016-11-18 4 views
0

私は、テーブルにこのモデルを結合して、細胞内のobjectNumberにbk_cntを接続model.getProperty()は、配列のメンバーであるオブジェクトのライブオブジェクトを返しますか?

{ 
    "task": [ 
     { 
     "dbid": 465, 
     "bk_cnt": 11, 
    }, { 
     "dbid": 472, 
     "bk_cnt": 16, 
    } 
      ] 
} 

である私のモデル(JSONmodelタイプ)の配列内からオブジェクトを取得します。これまでのところ問題ありません。

コードでは、ボタンを押すと最初の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()を追加するとそれは行います。このコードは大きなセクションから抽出され、大きな機能の1つは列のクリックによって並べ替えられます。再ソートする列をクリックすると(モデルに変更はありません)、値20が表示されます。

何がありますか?

Musings:model.getProprty()関数は、モデルへのライブ参照を含むjavascriptオブジェクトを返し、オブジェクトの値の変更は自動的にすべての境界のビューに反映されることを読んだコントロール。このステートメントは配列属性に該当しますか?

EDIT:それでも私は

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

は、ビューを更新するためにmodel.refreshを()を必要としないことを見つける問題を回避感じ。このコマンドがモデルを介して直接作用しているため、驚くべきことではありません。これは、getProperty()によって返された '生きている'オブジェクトが、文字列や整数のようなプリミティブなデータ型であっても、JSオブジェクトではないときにのみ生きていると考えています。または私は何かを逃していますか?

EDIT 2:@Ashは、モデルプロパティからJSオブジェクトにアクセスし、JSオブジェクトで更新する必要のある属性を設定してからモデルに置き換えるというアプローチがある、例えば

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

次の読者のためのアプローチのトリオを完了するために行われた第2の編集。

答えて

1

モデルオブジェクトは、javascriptオブジェクトの上にある抽象レイヤーです。オブジェクト内の変更がどこにでも通知される方法はありません。 model.refresh()またはmodel.setProperty()を使用して、通知を明示的に起動する必要があります。

は、だからあなたのソリューションの両方が(私が好む)もう一つは

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

なり、有効である。しかし、これは実際にどのようにあなたがあなたのUIオブジェクト:)

+0

にあなたのモデルをバインドする方法によって異なりI私のモデルをUIオブジェクトにバインドしますか?私はこの場合にテーブルを使用しており、属性 'items'が '{path: '/ task'}'に設定されたXMLビューで定義されています。バインドする別の方法がありますか? –

+0

追加のパラメータを持たない限り、{/ task}を使用してパスを省略できます。もちろん、プログラムでバインドすることもできます。 – matbtt

+0

'model.refresh()'は、そのモデルのすべてのバインディングを更新します。バインディングをリフレッシュすると、モデル内のJavascriptオブジェクトの現在の値でコントロールが更新されます。 'model.setProperty()'はもちろん、モデル内のJavascriptオブジェクトを変更し、同じパスまたはサブパスを持つすべてのバインディングを更新します。パフォーマンス上の理由から考慮する必要があります。ある行のデータだけが変更された場合は、すべての行を更新する必要はありません。 – schnoedel

関連する問題