2016-12-20 4 views
-1

Использование единого определения модели в manifest.jsonмодель доступа определяется в явном

"models": { 
    "i18n": { 
     "type": "sap.ui.model.resource.ResourceModel", 
     "settings": { 
      "bundleName": "....i18n.i18n" 
     } 
    }, 
    "": { 
     "dataSource": "mainService" 
    } 
} 

я могу связать модели с XML, и это работа

<List items="{path: '/myOneSet'}"> ... </List> 
<List items="{path: '/myTwoSet'}"> ... </List> 

, но я не могу получить доступ к нему из кода

this.getView().getModel().getProperty('/myOneSet') 

или

this.getView().getModel().getProperty('/myOneSet/>param') 

нет работа. Как это доступно?

+1

Вы звоните в свою модель в onInit? – matbtt

+0

Если вы пытаетесь получить доступ к модели в 'onInit', вы должны получить сообщение об ошибке в консоли, в котором' getProperty' не может быть вызвано с 'undefined'. Это то, что вы получаете? Или в чем проблема? – boghyon

ответ

0

Если вы определили модель в файле manifest.json, вы можете получить к ней доступ через Component. Если вы создали свой проект через шаблон, у вас есть файл BaseController.js, который является предком ваших других контроллеров, и есть функция getComponentModel. Таким образом, я хотел бы предложить вам попробовать этот код в контроллере:

this.getComponentModel().getProperty('/myOneSet') 
0

Из названия свойства, что вы пытаетесь получить доступ, я предполагаю, что вы используете ODataModel. Это верно?

Если это правда, вам нужно рассмотреть несколько вещей ... ODataModel.getProperty() не вызывает запросы. Вместо этого он вернет то, что уже доступно. Если вы хотите вызвать запрос, вы должны выполнить команду ODataModel.read(). Если вы хотите получить загруженные данные из ODataModel, то вы также должны знать , когда данные были загружены. Этого можно достичь, связав обработчик события изменения, когда вы выполняете привязку.

Вместо описания того, как получить доступ к данным ODataModel, я написал s little jsbin example для вас (или см. Ниже). Просто проверьте обработчик события изменения. Существует несколько способов доступа к данным.

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
     <meta charset="utf-8"> 
 
     <title>SAPUI5 single file template | nabisoft</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" 
 
      data-sap-ui-bindingSyntax="complex" 
 
      data-sap-ui-compatVersion="edge" 
 
      data-sap-ui-preload="async"></script> 
 
      <!-- use "sync" or change the code below if you have issues --> 
 
    
 
     <!-- XMLView --> 
 
     <script id="myXmlView" type="ui5/xmlview"> 
 
      <mvc:View 
 
       controllerName="MyController" 
 
       xmlns="sap.m" 
 
       xmlns:core="sap.ui.core" 
 
       xmlns:mvc="sap.ui.core.mvc"> 
 
    
 
       <Table 
 
        id="myTable" 
 
        growing="true" 
 
        growingThreshold="10" 
 
        growingScrollToLoad="true" 
 
        busyIndicatorDelay="0"> 
 
        <headerToolbar> 
 
         <Toolbar> 
 
          <Title text="Orders of ALFKI"/> 
 
          <ToolbarSpacer/> 
 
         </Toolbar> 
 
        </headerToolbar> 
 
        <columns> 
 
         <Column> 
 
          <Text text="OrderID"/> 
 
         </Column> 
 
         <Column> 
 
          <Text text="Order Date"/> 
 
         </Column> 
 
         <Column> 
 
          <Text text="To Name"/> 
 
         </Column> 
 
         <Column> 
 
          <Text text="Ship City"/> 
 
         </Column> 
 
        </columns> 
 
        <items> 
 
         <!-- filled via bindItems() in controller --> 
 
        </items> 
 
       </Table> 
 
    
 
      </mvc:View> 
 
     </script> 
 
    
 
     <!-- XML Fragment --> 
 
     <script id="myXMLFragment" type="ui5/fragment"> 
 
      <core:FragmentDefinition 
 
       xmlns="sap.m" 
 
       xmlns:core="sap.ui.core"> 
 
       <ColumnListItem type="Active"> 
 
        <cells> 
 
         <ObjectIdentifier title="{OrderID}"/> 
 
    
 
         <Text 
 
          text="{ 
 
           path:'OrderDate', 
 
           type:'sap.ui.model.type.Date', 
 
           formatOptions: { style: 'medium', strictParsing: true} 
 
          }"/> 
 
    
 
         <Text text="{ShipName}"/> 
 
    
 
         <Text text="{ShipCity}"/> 
 
    
 
        </cells> 
 
       </ColumnListItem> 
 
      </core:FragmentDefinition> 
 
     </script> 
 
    
 
     <script> 
 
      sap.ui.getCore().attachInit(function() { 
 
       "use strict"; 
 
    
 
       //### Controller ### 
 
       sap.ui.define([ 
 
        "sap/ui/core/mvc/Controller", 
 
        "sap/ui/model/odata/v2/ODataModel" 
 
       ], function (Controller, ODataModel) { 
 
        "use strict"; 
 
    
 
        return Controller.extend("MyController", { 
 
         onInit : function() { 
 
          this.getView().setModel(
 
           new ODataModel("https://cors-anywhere.herokuapp.com/services.odata.org/V2/Northwind/Northwind.svc/", { 
 
            json : true, 
 
            useBatch : false 
 
           }) 
 
          ); 
 
    
 
          var sPath = "/Customers('ALFKI')/Orders"; 
 
          var oTable = this.byId("myTable"); 
 
          var oTemplate = sap.ui.xmlfragment({ 
 
           fragmentContent : jQuery("#myXMLFragment").html() 
 
          });        
 
          
 
          oTable.bindItems({ 
 
           path : sPath, 
 
           template : oTemplate, 
 
           templateShareable : false, 
 
           sorter : null, 
 
           filters : null, 
 
           events : { 
 
           change : function (oEvent) { 
 
            var oModel, oListBnd, aContexts, i, oObj; 
 
            
 
            console.log("1. Example: ODataModel.getProperty() does not trigger a request (but here we have the data already)!"); 
 
            oModel = this.getView().getModel(); 
 
            console.dir(oModel.getProperty("/Orders(10643)")); //OK 
 
            console.dir(oModel.getProperty("/Orders"));  //Not OK 
 
            console.dir(oModel.getData("/"));    //DANGER: Could contain different entities!!!!! 
 
            
 
            console.log("2. Example: Accessing the Data via ListBinding"); 
 
            oListBnd = oTable.getBinding("items");  // get the ListBinding 
 
            //oListBnd = oEvent.getSource();    // this works here inside the change handler 
 
            aContexts = oListBnd.getCurrentContexts(); // the the contexts 
 
            for(i=0; i<aContexts.length; i++){ 
 
            oObj = aContexts[i].getObject(); // access the items/objects 
 
            console.dir(oObj); 
 
            }         
 
            
 
           }.bind(this) 
 
           } 
 
          }); 
 
          
 
         } 
 
        }); 
 
       }); 
 
    
 
       //### THE APP: place the XMLView somewhere into DOM ### 
 
       sap.ui.xmlview({ 
 
        viewContent : jQuery("#myXmlView").html() 
 
       }).placeAt("content"); 
 
    
 
      }); 
 
     </script> 
 
    
 
    </head> 
 
    
 
    <body class="sapUiBody"> 
 
     <div id="content"></div> 
 
    </body> 
 
</html>

-1

Привет Просто объявить это проявляется

"models": { 
 
\t "createMod": { 
 
\t \t \t \t "preload": true, 
 
\t \t \t \t "dataSource": "CreateService", 
 
\t \t \t \t "settings": { 
 
\t \t \t \t } 
 
}

и попробуйте получить доступ с помощью контроллера с помощью.
var oModelCheck = that.getOwnerComponent(). GetModel ("createMod");

1

Если mainService является услугой OData, тогда ваша модель - это модель ODataModel. Вы можете получить доступ к данным с помощью методов, описанных в API, например .: read()

this.getView().getModel().read('/myOneSet', { 
    success: function(oData, response) { 
     // do sg. with oData 
    } 
}); 

Большинство его методов доступа к данным имеет второй параметр-объект с функцией обратного вызова успеха. Эта функция будет вызываться асинхронно с данными по данному пути при успешном извлечении данных из источника данных. Большинство методов API ODataModel работают с обратными вызовами. Вы можете узнать больше о обратных вызовах here.

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