假设我想输入一个文本输入,用户可以在其中输入产品ID,然后按Enter键将产品数据加载到视图中。我只想一次加载/查看一个产品。
我为我的文本输入设置了一个事件处理程序,该事件处理程序输入了产品ID,然后调用read
了odata模型的方法:
onSubmit: function(){
var prodID = sap.ui.getCore().byId("product_id").getValue();
oData.read("/Products('" + prodID + "')", {
success: function(){
console.log(oData.getProperty("/Products('1')/Name")); // Outputs the product name
},
error: function(){}
});
},
这样可以成功将数据加载到模型中。但是,由于/Products('1')
要访问数据,您必须知道产品ID ,因此该模型是“锁定的”(因为缺乏更好的术语)。
我在哪里存储当前产品ID,以便后续视图知道如何访问已加载的产品名称?
目前,我在存储活动产品ID的地方定义了一个单独的JSON模型。在我的后续视图中onBeforeRendering
,我正在读取该活动产品ID,然后创建一个新的上下文,但这似乎不正确。
var context = new sap.ui.model.Context(myModel, "/Products(1)");
this.getView().setBindingContext(context, "products");
取决于您要做什么。
标准:您有一个XML视图。您想要在XML视图中的某个位置显示产品名称。
最简单的方法是将视图绑定到特定产品:
onSubmit: function() {
...
// assuming oData is a variable which holds your model
var sKey = oData.createKey("/Products", {
Id: prodID // Assuming Id is the name of your key property
});
this.getView().bindElement({
path: sKey,
model: "myModelName" // if your model has no name, remove this line
});
}
然后,您可以在视图中访问产品名称:
<Text text="{myModelName>Name}" />
将模型绑定到视图之后,您始终可以使用以下代码访问代码中的数据(和路径) oView.getBindingContext("myModelName");
如果您不想显示数据,但要进行一些计算:成功回调有两个参数。第一个包含数据。
oData.read(sKey, {
success: function(oResult){
...
}
});
您能否稍微扩展一下答案以解释如何更改后续视图的绑定?该
onSubmit
会router().navTo("AnotherPage")
-我怎么改变“AnotherPage”观点的结合路径?对我来说,这似乎是一个不同的问题。执行navTo时,应提供必要的键作为url参数(
.navTo("anotherPage", { Id: prodID })
。然后在后续视图中,您将拥有一个处理程序(Router.attachPatternMatched
),在其中构建新路径(createKey
和/或连接字符串)并绑定它(bindElement
)。attachPatternMatched
onNavTo
在第二个视图的控制器中创建事件正是我所缺少的。