1

リソースと呼ばれるモデルがあります。変更イベントをリッスンする必要があります。以下のようにバインディングをアタッチしました。

var resModel = this.getModel("resources");
var resBinding = new Binding(resModel, "resources>/resources", resModel.getContext("/resources"));
resBinding.attachChange(this._resourceChanged.bind(this));

以下のようにモデルにデータを追加すると、変更イベントがトリガーされません

var resources = this.getModel("resources").getProperty("/resources");
resources.push({
                 "res_num": 18,
                 "name": "New Added"
               });
this.getModel("resources").setProperty("/resources", resources);

しかし、初めてデータをモデルに追加すると、トリガーされます

this.resourceModel.setData({
  'resources': resources
});
4

1 に答える 1

1

ここで行うように BindingContext で Binding を作成することにより

new Binding(resModel, "resources>/resources", resModel.getContext("/resources"));

私の理解では、実際には「resources>/resources//resources」へのバインディングを作成します。BindingContext を使用する場合、バインディング パスは相対パスにする必要があります (先頭に「/」を付けない)。

new Binding(resModel, "resources>resources", resModel.getContext("/resources"));

しかし、ほとんどの場合、ここでは Context さえ必要ないため、これで十分です。

new Binding(resModel, "resources>resources");

これsap.ui.model.Bindingは抽象的であり、監視対象のプロパティがプレーン プロパティまたは配列である場合は、sap.ui.model.PropertyBindingorを使用する必要がある場合があることに注意してください。sap.ui.model.ListBinding

では、なぜあなたの「変更」がまだ最初にトリガーされるのでしょうか? setData がすべての変更リスナーをトリガーするか、初期データが誤ってバインドした構造に適合すると思います。

私は上記をテストしていません。JSBin を指定すると、簡単に実行できます。

BR クリス

于 2016-08-03T11:49:09.360 に答える