我正在玩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方法,如果我可以实现与第一个版本相同。请向我解释或指导可以解决我的困惑的文件。
答案 0 :(得分:5)
好的,让我们从模型开始:
JSON模型:JSON模型是客户端模型,因此适用于客户端完全可用的小型数据集。 JSON模型支持双向绑定。注意:在过滤,搜索,刷新时不会进行服务器端调用。
OData模型:OData模型是服务器端模型:数据集仅在服务器上可用,客户端只知道当前可见的行和字段。这也意味着无法在客户端上进行排序和过滤。为此,客户端必须向服务器发送请求。意思是搜索/过滤再次调用odata服务。
现在,让我们看看我们将使用这些模型的场景:
场景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(k42qhed3hw4zgjxfnhivnmes))/OData/OData.svc")
不会发送读取/获取请求。它调用odata服务并获取服务的元数据。服务可以包含多个实体。
例如:服务:http://services.odata.org/Northwind/Northwind.svc/有多个实体集,例如类别,客户,员工等。因此,当我声明:new sap.ui.model.odata.ODataModel("http://services.odata.org/Northwind/Northwind.svc/")
时,它将获取服务的元数据(不是实际数据)。只有当您调用所需的实体集时,它才会获取数据。指定了实体集:
'/Products'
)items='{/Products}'
)