JSONModel: как объединить с существующими данными при вызове «loadData»

#sapui5

#sapui5

Вопрос:

У меня есть следующая кодировка в моем контроллере приложений SAP UI5:

 var myView = this.getView();
var data1 = { "myDate": new Date() };
oModel.loadData("products.json");
oModel.setData(data1);
myView.setModel(oModel);
  

Где продукты.json — просто простые данные для таблицы на экране.

И я вижу только продукты.в результате на экране появляются данные в формате json и myDate с пустым значением внутри oModel (проверено в debug).

В случае, если я комментирую строку loadData, значение myDate отображается на экране и выглядит хорошо.

Как я могу использовать их вместе? Какова наилучшая практика для таких случаев?

Ответ №1:

Модель loadData является асинхронным процессом, поэтому он обновит модель после того, как вы установите ее синхронно с data1 . Кроме того, setData() все, что уже есть в модели, будет стерто, поэтому лучше используйте setProperty и обновляйте только определенный узел в вашей модели.

Вы должны добавить статические данные после того, как вы загрузили их из файла:

 oModel.attachRequestCompleted(function() {
    oModel.setProperty("/myExtraData", data1);
});
  

Затем добавленная вами дата будет доступна через /myExtraData/myData

Ответ №2:

Объедините новые данные с существующими с помощью bMerge параметра setData() .

 oModel.loadData("products.json");
var data1 = {
    "myDate": new Date()
};
oModel.attachRequestCompleted(function() {
   oModel.setData(data1, true);
});
  

Комментарии:

1. Я знал о опции bMerge, но она не работает без функции attachRequestCompleted. Ваш пример отлично работает, большое вам спасибо!

Ответ №3:

В API loadData также есть bMerge опция.

 oModel.setData({ myDate: new Date() });
oModel.loadData("products.json", null, true, "GET", /*bMerge*/true);  
 // Merged results:
{
  myDate: /*date object*/,
  produces: [/*...*/]
}
  

Нет необходимости регистрировать обработчик событий для requestCompleted .