如何在使用sap.ui.model.json.JSONModel向数组添加元素时强制进行绑定更新

How to force a binding update when adding a Element to a Array using sap.ui.model.json.JSONModel

本文关键字:元素 添加 更新 绑定 数组 sap ui JSONModel json model      更新时间:2023-09-26

我定义了一个sap.ui.model.json.JSONModel,如下所示:

var viewModel = new sap.ui.model.json.JSONModel({
    items: [
        { name: 'item 1'},
        { name: 'item 2'},
        { name: 'item 3'}
    ]
});
this.getView().setModel(viewModel, 'viewModel');

现在,我想向items数组添加一个新元素,并强制更新所有绑定。做到这一点的最佳方法/最佳实践是什么?现在我是这样做的:

var model = new sap.ui.model.json.JSONModel({ name: null });
var form = new sap.ui.layout.form.SimpleForm({
    // ... some code here with binding to `model` ...
});
form.setModel(model);
// ... some code here to trigger the code below ...
var viewModel = this.getModel('viewModel');
var items = viewModel.getProperty('/items');
items.push(model.getData());
viewModel.setProperty('/items', items);

但这看起来有点不对。有更好的方法更新viewModel吗?

您的使用方式是我也使用的两种方式之一,另一种是直接更改模型中的数据并调用刷新来更新绑定

var model = new sap.ui.model.json.JSONModel([]);
model.getData().push({aKey: "aValue"});
model.refresh();

在您的示例中添加一个项目将是

var model = this.getView();
model.getData().items.push({name: "someName"});
model.refresh();

好吧,我想我找到了一个更好的解决方案。首先,我这样扩展了JSONModel:

sap.ui.define([
    'sap/ui/model/json/JSONModel'
], function(JSONModel) {
    'use strict';
    return JSONModel.extend('app.model.JSONModelWithListProperty', {
        appendToList: function(property, itemToAppend) {
            var arr = this.getProperty(property);
            if ($.isArray(arr)) {
                arr.push(itemToAppend);
            }
            this.setProperty(property, arr);
            return this;
        }
    });
});

实例化现在看起来是这样的:

var viewModel = new app.model.JSONModelWithListProperty({
    items: [
        { name: 'item 1'},
        { name: 'item 2'},
        { name: 'item 3'}
    ]
});
this.getView().setModel(viewModel, 'viewModel');

因此,我可以通过简单地调用来更新列表

this.getModel('viewModel').appendToList('/items', model.getData());

对我来说看起来更好一点,并为我节省了一些代码行。我愿意接受任何建议。