如何处理绑定单个实体与 OData 模型

How to handle binding single entity with OData model

假设我想要一个文本输入,用户可以在其中键入产品 ID,然后按 Enter 键将产品数据加载到视图中。我只想一次加载/查看一个产品。

我为我的文本输入设置了一个事件处理程序,它获取输入的产品 ID,然后调用 odata 模型的 read 方法:

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(){}
    });
},

这成功地将数据加载到模型中。但是,模型是 "keyed"(因为缺少更好的术语)/Products('1'),这意味着要访问数据,您必须知道产品 ID。

问题

在哪里存储当前产品 ID,以便后续视图知道如何访问加载的产品名称?

我目前定义了一个单独的 JSON 模型,用于存储活动产品 ID。在我随后的视图 onBeforeRendering 中,我正在读取那个有效的产品 ID,然后创建一个新的上下文,但这似乎不正确。

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

取决于你想做什么。

标准:您有一个 XML 视图。您希望在 XML 视图中的某处显示产品名称。

最简单的方法是将您的视图绑定到特定产品:

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