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]
。只是路由class不喜欢格式
所以您可以做的就是将 0
传递给您的 detailPath
。在您的详细视图中,您可以构建原始密钥 ("nodes/" + detailPath
) 并将您的视图绑定到该密钥。
顺便说一句,我也会为 OData 推荐这种方法:
- 从绑定对象中提取实际密钥
- 将密钥传递给您的路由器
- 在您的详细视图中,根据传递的参数构建一个密钥
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"
我正在尝试使用本演练中的参数实现路由: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]
。只是路由class不喜欢格式
所以您可以做的就是将 0
传递给您的 detailPath
。在您的详细视图中,您可以构建原始密钥 ("nodes/" + detailPath
) 并将您的视图绑定到该密钥。
顺便说一句,我也会为 OData 推荐这种方法:
- 从绑定对象中提取实际密钥
- 将密钥传递给您的路由器
- 在您的详细视图中,根据传递的参数构建一个密钥
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"