2015-12-01 3 views
-1

Я новичок в SAPUI5, я хочу знать, как синхронизировать две модели. Я использую sap.ui.getCore(). SetModel() и sap.ui.getCore(). GetModel(), чтобы передавать данные между двумя контроллерами и между контроллером и его представлением. Теперь, если я изменю данные модели в одном контроллере, как я могу получить обновление во втором контроллере или в представлении.SAPUI5 - Как сохранить две модели в синхронизации

Ниже приведен пример структуры кода.

У меня есть customControl

sap.ui.core.Control.extend("CustomControl", {  // call the new Control type "my.Hello" 
              // and let it inherit from sap.ui.core.Control 
metadata : {        // the Control API 
    properties : { 
     .... 
     "dataProvider": {type : "any", defaultValue: new sap.ui.model.json.JSONModel()}, 
     .... 
    },}, 
render:function() { 
//I am using dataProvider as a model for the Table which is inside this CustomControl 

}} 

В связи я использую, что CustomControl как это

var oCustomCotrol = new CustomControl("XYZ",{....dataProvider: this.getModel("ModelData"),....}); 

В контроллере я настройка ModelData

onInit: function() { 
     console.log("Init update Market"); 
     var responseData = new sap.ui.model.json.JSONModel(); 
     // Ajax call to fetch the data assign it to reponseData, 
     sap.ui.getCore().setModel(responseData,"ModelData") 
}, 

данные изменяются но таблица в CustomControl не обновляется

+0

Не уверен, что ваша фактическая проблема заключается в том, что ... если вы измените данные в модели, хранящейся в ядре, и оба вида/контроллеры используют эту модель, изменения отразятся и в обоих представлениях, и на контроллерах. – Qualiture

+0

Никогда не видел, чтобы JSONModel использовался внутри пользовательский контроль ... не уверен, что ваш подход будет работать. Вместо этого почему бы не использовать стандартный подход и привязать свойство dataProvider к массиву - массив является свойством вашей внешней модели – Qualiture

+0

@Qualiture Спасибо за ваш ответ, используя bindProperty, дает мне ошибку «Uncaught TypeError: Can not read property 'indexOf' undefined ", может быть, он застрял в жизненном цикле компонента. – Prateek

ответ

0

Обычно вы просто создаете одну или несколько моделей и устанавливаете их либо на ядре, либо на компоненте (последний для приложений на основе компонентов). После этого модели отображаются в полном приложении/компоненте. Поэтому нет необходимости вручную синхронизировать несколько моделей, потому что у вас есть одна или несколько моделей, видимых повсюду. Когда модель изменяется на одном контроллере, это изменение отображается везде автоматически, потому что модель видна повсюду. Вот и все.

Я думаю, вам следует начать с чтения учебников по SAPUI5. Вот два хороших:

  1. Walkthrough Tutorial
  2. Data Binding Tutorial

прохождение игры является хорошим началом для всех. Привязка данных Учебник будет направлена ​​на связывание данных, то есть вы узнаете больше о моделях и т.д.

Может быть, это дает вам подсказку о том, как это сделать:

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <meta charset=utf-8 /> 
 
    <title>Demo</title> 
 

 
    <script src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js" 
 
      id="sap-ui-bootstrap" 
 
      data-sap-ui-theme="sap_bluecrystal" 
 
      data-sap-ui-libs="sap.m"></script> 
 

 
    <script> 
 
     
 
     jQuery.sap.declare("nabisoft.demo.CustomControl"); 
 
     sap.ui.core.Control.extend("nabisoft.demo.CustomControl", { 
 
      metadata: { 
 
       properties: { 
 
        title: {type: "string"} 
 
       } 
 
      }, 
 
      renderer : { 
 
       render : function(oRm, oControl) { 
 
        oRm.write("<div"); 
 
        oRm.writeControlData(oControl); 
 
        oRm.write(">"); 
 

 
        oRm.write("<h1>"); 
 
        oRm.write(oControl.getTitle()); 
 
        oRm.write("</h1>"); 
 
              
 
        oRm.write("</div>"); 
 
       } 
 
      } 
 
     });  
 
     
 
     var oModel = new sap.ui.model.json.JSONModel({ 
 
      theTitle : "Some Title" 
 
     }); 
 
     sap.ui.getCore().setModel(oModel,"modelName") 
 
     
 
     //show it works with javascript  
 
     var oControl = new nabisoft.demo.CustomControl({ 
 
      title:"{modelName>/theTitle}" 
 
     }); 
 
     oControl.placeAt("content"); 
 
     
 
    </script> \t \t 
 
\t 
 
    </head> 
 
    
 
    <body> 
 
    <div id="content"></div> 
 
    </body> 
 
</html>

+0

Спасибо Наби, я только что обновил свой вопрос, чтобы быть более точным. Пожалуйста, взгляните на это и сообщите мне, если мой вопрос более ясен. – Prateek

+1

Нет необходимости иметь свойство в пользовательском элементе управления для вашей модели! Каждый элемент/элемент управления может использовать мощные функции привязки данных, которые предлагает UI5. Опять же, пожалуйста, прочитайте учебники! Пошаговое руководство даже немного обрабатывает пользовательские элементы управления. Вы также можете проверить мои учебники UI5 на https://www.nabisoft.com/tutorials/sapui5/, особенно взгляните на https://www.nabisoft.com/tutorials/sapui5/creating-custom-controls-in- сапуй5. Как вы увидите, нет абсолютно никакой необходимости в таком свойстве в пользовательских элементах управления, которые содержат сама модель !!! – Nabi

+0

@Prateek Я обновил свой ответ и добавил исполняемый пример ... – Nabi

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