Как обрабатывать связывание одного объекта с моделью OData - PullRequest
0 голосов
/ 04 февраля 2020

Предположим, я хотел бы ввести текстовый ввод, в котором пользователь вводил бы идентификатор продукта и нажимал ввод, чтобы загрузить данные продукта в представление. Я хочу загружать / просматривать только один продукт за один раз.

Я устанавливаю обработчик событий для ввода текста, который получает введенный идентификатор продукта, а затем вызывает метод read для модели odata:

onSubmit: function(){
    var prodID = sap.ui.getCore().byId("product_id").getValue();
    oData.read("/Products('" + prodID + "')", {
        success: function(){
            console.log(oData.getProperty("/Products('1')/Name")); // Outputs the product name
        },
        error: function(){}
    });
},

Это успешно загружает данные в модель. Тем не менее, модель «обозначена» (из-за отсутствия лучшего термина) /Products('1'), что означает, что для доступа к данным необходимо знать идентификатор продукта.

Вопрос

Где я могу сохранить текущий идентификатор продукта, чтобы последующие представления знали, как получить доступ к имени загруженного продукта?

В настоящее время у меня определена отдельная модель JSON, в которой я храню активный идентификатор продукта. В моем следующем представлении onBeforeRendering я читаю этот активный идентификатор продукта, а затем создаю новый контекст, но это не так.

var context = new sap.ui.model.Context(myModel, "/Products(1)");
this.getView().setBindingContext(context, "products");

1 Ответ

2 голосов
/ 05 февраля 2020

Зависит от того, что вы хотите сделать.

Стандарт: у вас есть XML представление. Где-то в вашем представлении XML вы хотите отобразить название продукта.

Самый простой способ - привязать ваше представление к определенному c продукту:

onSubmit: function() {
    ...
    // assuming oData is a variable which holds your model
    var sKey = oData.createKey("/Products", {
        Id: prodID // Assuming Id is the name of your key property
    });
    this.getView().bindElement({
        path: sKey,
        model: "myModelName" // if your model has no name, remove this line
    });
}

Тогда вы можете доступ к названию продукта в вашем представлении:

<Text text="{myModelName>Name}" />

После привязки модели к представлению вы всегда можете получить доступ к данным (и пути) в вашем коде, используя oView.getBindingContext("myModelName");


Если вы не хотите отображать данные, но делаете некоторые вычисления: обратный вызов успеха имеет два параметра. Первый содержит данные.

oData.read(sKey, {
    success: function(oResult){
        ...
    }
 });
...