Событие изменения не запускается для 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 Крис