new sap.ui.model.odata.ODataModel和read之间有什么区别?

时间:2017-01-31 15:34:39

标签: odata sapui5

我正在玩OData服务,我很困惑何时使用这个

var oModel = new sap.ui.model.odata.ODataModel("proxy/http/services.odata.org/V3/(S(k42qhed3hw4zgjxfnhivnmes))/OData/OData.svc");
this.getView().setModel(oModel);

vs

var oModel = new sap.ui.model.odata.ODataModel("odatserviceurl", true);
var productsModel = new JSONModel();

oModel.read("/Products",
     null,
     null,
     false,
     function _OnSuccess(oData, response) {
         var data = { "ProductCollection" : oData.results };
         productsModel.setData(data);
     },
     function _OnError(error) {
         console.log(error);
     }
);
this.getView().setModel(productsModel);

我有两个使用这两种方法的工作示例,但我无法弄清楚为什么使用read方法,如果我可以实现与第一个版本相同。请向我解释或指导可以解决我的困惑的文件。

1 个答案:

答案 0 :(得分:5)

好的,让我们从模型开始:

  1. JSON模型:JSON模型是客户端模型,因此适用于客户端完全可用的小型数据集。 JSON模型支持双向绑定。注意:在过滤,搜索,刷新时不会进行服务器端调用。

  2. OData模型:OData模型是服务器端模型:数据集仅在服务器上可用,客户端只知道当前可见的行和字段。这也意味着无法在客户端上进行排序和过滤。为此,客户端必须向服务器发送请求。意思是搜索/过滤再次调用odata服务。

  3. 现在,让我们看看我们将使用这些模型的场景:

    场景1:以列表/表格/显示形式向用户显示数据。数据操作仅限于搜索和过滤。在这里,我会直接使用oData模型来控制,因为只需要获取数据。(你的方法1)(注意:单向绑定)。请记住,所有更改都需要调用服务器。

    场景2:我的应用程序有多个输入,用户可以编辑更改,还有一些字段是计算和强制的。总而言之,许多用户更改都是临时的,用户可能不想保存它们。在这里,您不希望将这些临时更改发送到后端。您希望在发送之前操纵,验证数据。在这里,我们将在从odata模型(您的方法2)读取数据后使用JSON模型。将更改存储在本地JSON模型中,验证并操作它们,最后使用Odata创建/更新发送数据。请记住,所有更改都不需要调用服务器,因为本地JSON模型中存在数据。

    如果这有助于您,请告诉我。 :)

    编辑:附加信息:

    根据你的评论:

    文档说oModel.read'触发get请求,但是新的sap.ui.model.odata.ODataModel(" proxy / http / services.odata.org / V3 /(S(k42qhed3hw4zg jxfnhivnmes))/ OData / OData.svc&#34 ;)`做同样的事情,为什么以及何时使用oModel.read

    在这里,你误解了。代码 new sap.ui.model.odata.ODataModel("proxy/http/services.odata.org‌​/V3/(S(k42qhed3hw4zg‌​jxfnhivnmes))/OData/‌​OData.svc")不会发送读取/获取请求。它调用odata服务并获取服务的元数据。服务可以包含多个实体。 例如:服务:http://services.odata.org/Northwind/Northwind.svc/有多个实体集,例如类别,客户,员工等。因此,当我声明:new sap.ui.model.odata.ODataModel("http://services.odata.org/Northwind/Northwind.svc/")时,它将获取服务的元数据(不是实际数据)。只有当您调用所需的实体集时,它才会获取数据。指定了实体集:

    1. 当您调用read方法时(就像您已指定'/Products'
    2. 将实体集名称直接绑定到控件,如List,Table等(items='{/Products}'