2016-10-09 3 views
0

У меня есть некоторые проблемы с передачей параметров с главной страницы на деталь в SplitApp. Я использую локальный файл JSON, который указан как модель в manifest.json.SAP UI5: проблемы с параметром master-detail

Я могу передать идентификатор объекта, но в этом случае я не могу понять, как получить соответствующий элемент в подробном представлении, связать его с представлением.

Я также попытался передать путь к элементу, но в этом случае url не изменится после того, как я выберу элемент списка.

Любые идеи, как я могу отображать детали на странице подробностей?

manifest.json:

... 
    "models": { 
      "items": { 
       "type": "sap.ui.model.json.JSONModel", 
       "uri": "model/items.json" 
      } 
     }, 
    "routing": { 
      "config": { 
       "controlId": "rootControl", 
       "viewPath": "my.try.view", 
       "viewType": "XML", 
       "async": true 
      }, 
      "routes" : [ 
       { 
        "pattern" : "", 
        "name" : "master", 
        "target" : ["detail", "master"] 
       }, 
       { 
        "pattern": "detail/{Id}", 
        "name":"detail", 
        "target": ["master", "detail"] 
       } 
      ], 
      "targets" : { 
       "master" : { 
       "viewName" : "Master", 
       "controlAggregation" : "masterPages" 
       }, 
       "detail" : { 
        "viewName" : "Detail", 
        "controlAggregation" : "detailPages" 
       } 
      } 
     }... 

Master.view.xml

<mvc:View controllerName="my.try.controller.Master" xmlns:semantic="sap.m.semantic" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m"> 
    <semantic:MasterPage title="Persons"> 
        <List id="idList" items="{items>/item}" selectionChange="onItemPressed" mode="SingleSelectMaster"> 
         <items> 
          <ObjectListItem title="{item>Date}"> 
           <firstStatus> 
            <ObjectStatus text="{item>Status}"/> 
           </firstStatus> 
          </ObjectListItem> 
         </items> 
        </List> 
     </semantic:MasterPage> 
</mvc:View> 

Master.controller.js

sap.ui.define([ 
    "sap/ui/core/mvc/Controller", 
    "sap/ui/model/json/JSONModel" 
    ], function(Controller, JSONModel) { 

     "use strict"; 

     return Controller.extend("my.try.controller.Master", { 

     onInit: function() { 
      this.oRouter = this.getOwnerComponent().getRouter(); 
     }, 

     onItemPressed: function(oEvent) { 
     // When I try with the path, nothing happens. Only passing the Id works!? 
     // var oItemID = oEvent.getParameter("listItem").getBindingContext("items").getPath().substr(1); 
      var oItemID = oEvent.getParameter("listItem").getBindingContext("items").getProperty("Id"); 
      this.oRouter.navTo("detail", { 
      Id: oItemID 
      }); 
     } 
     }); 
    }); 

Detail.view.xml

<mvc:View controllerName="my.try.controller.Detail" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:semantic="sap.m.semantic"> 
    <semantic:DetailPage title="Detail"> 
     <ObjectHeader title="{ItemName}"/> 
    </semantic:DetailPage> 
</mvc:View> 

Detail.controller.js

sap.ui.define([ 
     "sap/ui/core/mvc/Controller" 
     ], function(Controller) { 

      "use strict"; 

      return Controller.extend("my.try.controller.Detail", { 

      onInit: function() { 
       this.oRouter = this.getOwnerComponent().getRouter(); 
       this.oRouter.getRoute("detail").attachPatternMatched(this._onDetailRouteHit, this); 
      }, 

      _onDetailRouteHit: function(oEvent) { 

       var sID = oEvent.getParameter("arguments").Id; 
//The parameter is passed 
       alert(sID); 

//This doesn't work. How can I do this withou having a service? 
       this.getView().getModel().metadataLoaded().then(function() { 
        var sObjectPath = this.getView().getModel().createKey("ItemSet", { 
         Id : sID 
        }); 
        this.getView().bindElement({ 
         path: "/" + sObjectPath 
        }); 
       }.bind(this)); 
      } 
     }); 
    }); 

ответ

0

Я бы рекомендовал использовать ID вместо пути привязки, так как URL маршрута bookmarkable. При использовании пути привязки выбранная деталь может измениться при изменении коллекции.

A JSONModel не имеет понятия метаданных или ключей. Таким образом, вы должны искать модель для элемента и построить связывающий путь самостоятельно:

  _onDetailRouteHit: function(oEvent) { 

       var sID = oEvent.getParameter("arguments").Id; 
//The parameter is passed 
       alert(sID); 
       var model = this.getView().getModel("items"); 

       // If you are not shure if the data has been loaded 
       // you should create a promise together with the model, 
       // fullfill it in the requestCompleted Event and 
       // execute the next lines in its then(). 

       var array = model.getProperty("/ItemSet"); 
       for(var i = 0, len=array.length; i<len; i++){ 
        if (array[i].Id===sID){ 
         this.getView().bindElement({ path: "items>/ItemSet/"+i }); 
         break; 
        } 
       } 
      } 
+0

Хорошо, спасибо за подсказку! Кажется, что модель не установлена ​​для представления. Я получаю сообщение об ошибке: «Неподготовленная (в обещании) ошибка типа: Невозможно прочитать свойство« getProperty »неопределенного. Хотя, определяя модели в дескрипторе, модели должны быть доступны во всем приложении. Я ошибаюсь? – manban

+0

Вы инициализируете маршрутизатор после вызова метода init() 'базовых классов в ваших элементах' init() '? Поместите точку останова после вызова base.init() и убедитесь, что модель доступна для компонента. Представления должны наследовать модели компонент – schnoedel

+0

А, я только что узнал, что ваша модель называется * items *. Вы должны указать имя методу getModel() и префикс модели в элементеbinding. – schnoedel

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