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"));

据我了解,您实际上创建了与“资源>/资源//资源”的绑定。使用 BindingContext 时,绑定路径应该是相对的(没有前导“/”):

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

但很可能您甚至不需要 Context ,这样就足够了:

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

请注意,这sap.ui.model.Binding是抽象的,您可能需要使用sap.ui.model.PropertyBindingsap.ui.model.ListBinding依赖于被监视的属性是普通属性或数组。

那么为什么你的“改变”最初仍然会触发呢?我猜这 setData 只会触发所有更改侦听器,或者您的初始数据适合您意外绑定的结构。

我没有测试过上面的。如果您提供一个 JSBin,这将是一件容易的事。

克里斯

于 2016-08-03T11:49:09.360 回答