我目前正在開發一個SAP UI5的應用程序。如何在每次調用相應視圖時使UI5控制器重新加載模型數據?
目前我有兩個視圖,一個是主視圖和一個詳細視圖,顯示的是一個圖表,而顯示的數據取決於在主視圖中選擇了哪個選項。
這是詳細視圖控制器的相關部分:
chartData: function(param)
{
var view = this.getView();
var oChart = this.getView().byId("ProductionStatistics");
var orders = view.getModel("data").getProperty("/").Orders;
console.log(orders);
for (var i = 0; i < orders.length; i++)
{
if (orders[i].anr === param)
{
var details = orders[i].detail;
console.log(details);
var intmodel = new sap.ui.model.json.JSONModel(details);
view.setModel(intmodel,"details");
var set = new sap.viz.ui5.data.FlattenedDataset(
{
dimensions:
[
{name: 'Bezeichnung',value: "{key}"}
],
measures:
[
{name: 'Wert',value: "{value}"}
],
data: "{details>/}"
});
oChart.setDataset(set);
}
}
// $.ajax({
// url: "model/data.json",
// success: function(data, textStatus, jqXHR)
// {
// var orders = data.Orders;
// for (var i = 0; i < orders.length; i++)
// {
// if (orders[i].anr === param)
// {
// var chartdata = orders[i].detail;
// chartdata.pop(); chartdata.pop();
// var model = new sap.ui.model.json.JSONModel(chartdata);
// view.setModel(model,"chartdata");
//
// var path = "data>/Orders/" + i + "/detail";
// var set = new sap.viz.ui5.data.FlattenedDataset(
// {
// dimensions:
// [
// {name: 'Bezeichnung',value: "{key}"}
// ],
// measures:
// [
// {name: 'Wert',value: "{value}"}
// ],
// data: "{chartdata>/}"
// });
//
// oChart.setDataset(set);
// }
// }
// },
// error: function(data, textStatus, jqXHR) {
// console.error("AJAX-ERROR \n" + textStatus + "\n" + jqXHR);
// }
// });
},
_patternMatched: function(oEvent)
{
var param = oEvent.getParameter("arguments").anr;
this.chartConfig(param);
this.chartData(param);
},
onInit: function(oEvent)
{
var oRouter = this.getRouter();
oRouter.getRoute("donutchart").attachMatched(this._patternMatched, this);
},
這是JSON文件,這是由「數據」模型(I加入它作爲一個數據源所表示的相關部分manifest.json)。通過加載從模型中完全「訂單」陣列,通過各項目和比較所述鍵「ANR」:
"Orders":
[
{
"key":"0001",
"anr":"0001",
"detail":
[
{"key":"Stat1","value":10500,"icon":"sap-icon://product"},
{"key":"Stat2","value":1500,"icon":"sap-icon://product"},
{"key":"Stat3","value":12,"icon":"sap-icon://product"},
{"key":"Stat4","value":1200,"icon":"sap-icon://product"},
{"key":"Stat5","value":6,"icon":"sap-icon://person-placeholder"}
],
"worker":
[
{"key":"Max Mustermann","value":"Montierer","icon":"sap-icon://person-placeholder"},
{"key":"Max Mustermann","value":"Montierer","icon":"sap-icon://person-placeholder"},
{"key":"Max Mustermann","value":"Verpacker","icon":"sap-icon://person-placeholder"},
{"key":"Max Mustermann","value":"Verpacker","icon":"sap-icon://person-placeholder"},
{"key":"Max Mustermann","value":"Prüfer","icon":"sap-icon://person-placeholder"}
]
},
因此概括地說,控制器將分配正確的數據,以圖表(ProductionStatistics ID)由主視圖提供的參數(訂單編號,要顯示的數據)。在匹配時,控制器會將正確的訂單細節添加到模型「細節」中,最終調用並分配給圖表。
我在這裏面臨的問題是,這種解決方案只在第一次加載詳細視圖時起作用。如果我返回到主頁視圖並以不同的選定順序再次加載詳細視圖,則圖表仍將顯示在視圖第一次調用時選擇的訂單數據。 通過使用AJAX的替代解決方案(註釋掉)工作正常,但由於應用程序應該與OData服務一起使用,而不是與本地.json文件一起使用,實際上這不是解決方案。
是否有解決方案讓控制器重新加載模型並在每次加載視圖時都正確執行chartData函數?我已經試圖在onBeforeRendering/onAfterRendering方法中保留所有的功能,但這種方法並不適用。
在此先感謝