Событие изменения не запускается для JSONModel

У меня есть модель под названием ресурсы, мне нужно прослушать событие изменения, я прикрепил привязку, как показано ниже

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

1 ответ

Решение

Создавая Binding с BindingContext, как вы делаете здесь

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

в моем понимании вы фактически создаете привязку к "ресурсам>/ ресурсам // ресурсам". При использовании BindingContext путь привязки должен быть относительным (без начального "/"):

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

Но, скорее всего, вам даже не нужен контекст здесь, чтобы этого было достаточно:

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

Обратите внимание, что sap.ui.model.Binding является абстрактным, и вам может понадобиться sap.ui.model.PropertyBinding или же sap.ui.model.ListBinding в зависимости от наблюдаемого свойства, являющегося простым свойством или массивом.

Так почему же ваше "изменение" все еще срабатывает изначально? Я предполагаю, что setData просто вызовет ВСЕХ слушателей изменений или ваши исходные данные соответствуют структуре, которую вы случайно связали.

Я не проверял выше. Если вы предоставите JSBin, это будет легко сделать.

BR Крис

Другие вопросы по тегам