2017-01-30 2 views
1

Я следую за tutorial здесь, и я застрял в маршрутизации с параметрами.Маршрутизация с параметрами не работает

Пример приложения не запускался в моем локальном использовании, поэтому я изменяю его, чтобы использовать локальные данные. Тем не менее, я получаю сообщение об ошибке «Неиспользуемая ошибка: недопустимое значение« Счета-фактуры/1 »для сегмента« {invoicePath »« ", когда я нажимаю на элемент в списке счетов-фактур. Он должен открыть новую страницу с подробными данными и отобразить название продукта и сумму.

Вот мой манифест маршрутизации:

"routing": { 
     "config": { 
     "routerClass": "sap.m.routing.Router", 
     "viewType": "XML", 
     "viewPath": "sap.ui.demo.wt.view", 
     "controlId": "app", 
     "controlAggregation": "pages" 
     }, 
     "routes": [ 
     { 
      "pattern": "", 
      "name": "overview", 
      "target": "overview" 
     }, 
     { 
      "pattern": "detail/{invoicePath}", 
      "name": "detail", 
      "target": "detail" 
     } 
     ], 
     "targets": { 
     "overview": { 
      "viewName": "Overview" 
     }, 
     "detail": { 
      "viewName": "Detail" 
     } 
     } 
    } 

Invoices.json пример данных:

{ 
    "Invoices": [ 
    { 
     "ProductName": "Pineapple", 
     "Quantity": 21, 
     "ExtendedPrice": 87.2000, 
     "ShipperName": "Fun Inc.", 
     "ShippedDate": "2015-04-01T00:00:00", 
     "Status": "A" 
    } 
    ] 
} 

InvoiceList.controller.js. Где я заполняю список счетов-фактур и вызываю изменение вида.

sap.ui.define([ 
    "sap/ui/core/mvc/Controller", 
    "sap/ui/model/json/JSONModel", 
    "sap/ui/demo/wt/model/formatter", 
    "sap/ui/model/Filter", 
    "sap/ui/model/FilterOperator" 
], function (Controller, JSONModel, formatter, Filter, FilterOperator) { 
    "use strict"; 

    return Controller.extend("sap.ui.demo.wt.controller.InvoiceList", { 

     onPress: function (oEvent) { 
      var oItem = oEvent.getSource(); 
      var oRouter = sap.ui.core.UIComponent.getRouterFor(this); 
      oRouter.navTo("detail", { 
       invoicePath: oItem.getBindingContext("invoice").getPath().substr(1) 
      }); 
     } 
    }); 

}); 

ответ

2

Сообщение об ошибке поднимается библиотекой маршрутизатора. Маршрут определяется как detail/{invoicePath}, и вы передаете Invoice/1 в качестве параметра, который недопустим, поскольку параметр содержит косую черту, которая рассматривается как разделитель сегментов URL.

Однако вы упомянули, что вы не могли запустить пример локально и сделали некоторые усыновления. Путь выглядит так, как будто вы используете JSONModel. Это означает, что вам необходимо принять несколько частей в вашем примере.

InvoiceList контроллер:

oItem.getBindingContext("invoice").getPath().substr(10) 

Связующий контекст должен быть /Invoices/1 и вы хотите передать только индекс. Поэтому вам нужно отключить /Invoices/.

Деталь контроллер:

_onObjectMatched: function (oEvent) { 
    this.getView().bindElement({ 
     path: "/Invoices/"+ oEvent.getParameter("arguments").invoicePath, 
     model: "invoice" 
    }); 
} 

Это будет связывать ваш взгляд на /Invoices/1 в соответствующей модели.

0

Ответ @matbtt правильный.

Другим решением является вытащить ПУТЬ. Нет substr и специальный offset.

encodeURIComponent(oItem.getBindingContext("invoice").getPath())

_onObjectMatched: function (oEvent) { 
    this.getView().bindElement({ 
     path: decodeURIComponent(oEvent.getParameter("arguments").invoicePath), 
     model: "invoice" 
    }); 
} 

как модель JSON и OData будет хорошо работать.

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