2017-01-31 9 views
0

Я играю с сервисом OData, и я очень смущен, когда использовать этотВ чем разница между новым sap.ui.model.odata.ODataModel и чтением?

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

против

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); 

У меня есть два работающих пример, используя оба подхода, но я не могу понять, зачем использовать метод чтения, если я могу добиться того же с первой версией. Пожалуйста, объясните или направьте меня к документации, которая может устранить мою путаницу.

ответ

4

Хорошо, давайте начнем с моделями:

  1. JSON Модель: Модель JSON представляет собой модель на стороне клиента, и, следовательно, предназначены для небольших наборов данных, которые полностью доступны на клиенте. Модель JSON поддерживает двустороннюю привязку. ПРИМЕЧАНИЕ: вызов на стороне сервера не выполняется при фильтрации, поиске, обновлении.

  2. OData Модель: Модель OData представляет собой модель на стороне сервера: набор данных доступен только на сервере, и клиент знает только видимые в данный момент строки и поля. Это также означает, что сортировка и фильтрация на клиенте невозможны. Для этого клиент должен отправить запрос на сервер. Значение поиска/фильтрации снова вызывает службу odata.

Теперь давайте посмотрим на сценарии, где мы будем использовать эти модели:

Сценарий 1: Отображение данных пользователю в виде списка/таблицы/формы отображения. Обработка данных ограничена поиском и фильтрацией. Здесь я бы использовал модель oData непосредственно для элементов управления, так как требуется только выборка данных (ваш метод 1) (ПРИМЕЧАНИЕ: привязка к одному каналу). Помните, что для всех изменений требуется вызов сервера.

Сценарий 2: У меня есть приложение, которое имеет несколько входов, пользователь может редактировать изменения, а также некоторые поля рассчитываются и являются обязательными. В общем, сделано много пользовательских изменений, которые могут быть временными, и пользователь может не захотеть их сохранить. Здесь вы еще не хотите отправлять эти временные изменения в бэкэнд. Вы хотите манипулировать, проверять данные перед отправкой. Здесь мы будем использовать JSON Model после чтения данных из модели odata (ваш метод 2). Сохраните изменения в локальной модели JSON, проверьте и обработайте их и, наконец, отправьте данные с помощью создания/обновления Odata. Помните, что все изменения НЕ требуют вызова сервера, поскольку данные присутствуют в локальной модели JSON.

Дайте мне знать, если это поможет вам. :)

EDIT: Дополнительная информация:

В соответствии с Вашим комментарием:

Документация говорит триггер oModel.read»получить запрос, но новый sap.ui.model.odata.ODataModel (" прокси/HTTP/services.odata.org/V3/(S (k42qhed3hw4zg jxfnhivnmes))/OData/OData.svc ")` делает то же самое, поэтому почему и когда использовать 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. При вызове метода чтения (как вы определили '/Products')
  2. Bind множество сущностей имя непосредственно контролировать, как в список, таблица и т.д. (items='{/Products}')
+0

Да, это очень помогает. Но все же я не понимаю, как использовать «oModel.read». Документация говорит, что запрос 'oModel.read 'запускает запрос, но' new sap.ui.model.odata.ODataModel ("proxy/http/services.odata.org/V3/(S (k42qhed3hw4zgjxfnhivnmes))/OData/OData.svc") 'делает то же самое, поэтому зачем и когда использовать' oModel.read'. Спасибо – user557657

+0

@ user557657: Обновлена ​​информация в ответе. –

+0

Спасибо за удивительное объяснение. Я закончу этот вопрос последним вопросом. Что делать, если я запрашиваю конкретную сущность с использованием 'new sap.ui.model.odata.ODataModel (« http://services.odata.org/Northwind/Northwind.svc/Products »)? Тогда я не думаю, что мне это понадобится метод чтения? Я должен иметь возможность просто привязывать результат для объекта привязки к элементам управления, таким как List, Table и т. Д.? Спасибо – user557657

 Смежные вопросы

  • Нет связанных вопросов^_^