簡體   English   中英

SAPUI5:使用參數進行路由-如何獲取綁定上下文的正確路徑

[英]SAPUI5: Routing with parameters - How get correct path of binding context

我正在嘗試使用此演練中的參數來實現路由: https : //sapui5.hana.ondemand.com/1.58.7/#/topic/2366345a94f64ec1a80f9d9ce50a59ef

但是,與其獲取數據作為路徑

/Invoices(CustomerName='Alfreds%20Futterkiste',Discount=0f,OrderID=10835....

當他們這樣做時:

oRouter.navTo("detail", {invoicePath: 
oItem.getBindingContext("invoice").getPath().substr(1)});

當我在控制器中使用該函數時(請參見下面的onFwdDetail),我只會得到一個字符串路徑:

nodes/0

而且不能在路由中使用(請參見下面的manifest.json):

Invalid value "nodes/0" for segment "{detailPath}".

我認為這是因為我的JSON文件的結構與演練中的不同。 如何獲得帶有用於路由的數據的正確路徑?

我的實現的相關部分如下:

Data.JSON

{
"nodes": [
    {
        "text": "Text1",
        "status1": "Status10",
        "status2". "Status11"
    },
    {
        "text": "Text2",
        "status1": "Status20",
        "status2". "Status21"
    },...]
}

Overview.view.xml

<Table
    items="{path: 'mydata>/nodes'}">
...
<ColumnListItem type="Navigation" press="onFwdDetail">

Overview.controller.js

onInit : function() {
        var oModel = new JSONModel("model/Data.JSON");
        this.getView().setModel(oModel, "mydata");

    },
onFwdDetail : function(oEvent) {
        var oItem = oEvent.getSource();
        var oRouter = sap.ui.core.UIComponent.getRouterFor(this);
        oRouter.navTo("detail", {detailPath: 
           oItem.getBindingContext("mydata").getPath().substr(1)});
        console.log(oItem.getBindingContext("mydata").getPath().substr(1));

    }

的manifest.json

{
"pattern": "details/{detailPath}",
"name": "details",
"target": "details"
}

它們的路徑是到OData模型的實體的路徑。 您的路徑是JSON模型實體的路徑。

這些路徑完全不同。 最重要的是,您的路徑中包含斜線,而他們的路徑中沒有。 這使試圖匹配details/{detailPath}details/nodes/0的解析器感到困惑。

在您的示例中, 0本身是有效路徑。 nodes是一個數組,可以執行nodes[0] 只是路由類不喜歡這種格式。

因此,您只需將0傳遞給detailPath 然后,您可以在詳細視圖中構建原始鍵( "nodes/" + detailPath )並將視圖綁定到該鍵。

對於OData btw,我還將推薦這種方法:

  • 從綁定對象中提取實際鍵
  • 將密鑰傳遞到路由器
  • 在您的詳細信息視圖中,根據傳遞的參數構建密鑰

OData模型的偽代碼:

控制器A:

// read relevant values from binding context
var oContext = oItem.getBindingContext("myModel");
var sKeyName = oContext.getObject("CustomerName");
var sKeyId = oContext.getObject("OrderID");

// trigger navigation
oRouter.navTo("orderDetail", { name: sKeyName, id: sKeyId });

控制器B:

_onRouteMatched: function (oEvent) {
    var oModel = this.getModel("myModel");
    var that = this;

    // read params from routing
    var sKeyName = oEvent.getParameter("arguments").name;
    var sKeyId = oEvent.getParameter("arguments").id;

    // as soon as the metadata of the model are available there is a great API to build keys
    oModel.metadataLoaded().then(function () {

        var sPath = oModel.createKey("/Invoices", {
            CustomerName: sKeyName,
            OrderID: sKeyId
        });

        // sPath should be something like "/Invoices(CustomerName='Troll',OrderID=12345)"
        that.getView().bindElement({ path: sPath });

    });
},

的manifest.json

"pattern": "order/{name},{id}",
"name": "orderDetail"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM