javascript - 在 UI5 中编辑/更新绑定数据时未发生数据绑定
问题描述
我有一个主详细信息页面,其中有一个克隆按钮。单击克隆按钮时,第一个列表项的数据被放入模型(detailModel - 在 component.js 中声明)并打开一个新屏幕。该列表项的数据绑定到某些输入字段。当任何输入字段被更新/删除,然后用户导航返回而不保存它并再次进入该页面时,该更新/删除的字段保持空白。我希望该数据进入早先出现但空白的字段。我的模型中的数据也没有改变。下面是代码:
组件.js:
this.detailModel = new sap.ui.model.json.JSONModel();
this.detailModel.setDefaultBindingMode(sap.ui.model.BindingMode.OneWay);
sap.ui.getCore().setModel(this.detailModel, "detailModel");
控制器.js:
/*eslint-disable no-console, no-alert */
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel",
"hmel/TravelandGuestHouse/controller/formatter",
"sap/m/MessageToast",
"sap/m/MessageBox",
"sap/m/Button",
"sap/m/Dialog",
"sap/m/Text",
'sap/m/Label',
'sap/m/TextArea'
], function (Controller, JSONModel, formatter, MessageToast, MessageBox, Button, Dialog, Text, Label, TextArea) {
"use strict";
return Controller.extend("hmel.TravelandGuestHouse.controller.CloneTravelRequest", {
onInit: function () {
this.router = sap.ui.core.UIComponent.getRouterFor(this);
//for cloning request
this.detailModel = sap.ui.getCore().getModel("detailModel");
this.getView().setModel(this.detailModel, "detailModel");
//for sending data to guest house screen
this.getView().byId("date").setDateValue(new Date());
this.router.attachRoutePatternMatched(this._handleRouteMatched, this);
},
_handleRouteMatched: function (evt) {
if (evt.getParameter("name") !== "CloneTravelRequest") {
return;
}
this.getView().invalidate();
var that = this;
//fetching Train Names
$.ajax({
url: "/Non_sap_create_requests/odata/TravelPrpTrainDetails",
method: "GET",
dataType: "json",
success: function (data) {
that.getView().getModel("Model").setProperty("/TravelPrpTrainDetails", data.value);
var tempModel = that.getView().getModel("detailModel");
var train = tempModel.getData().TrainName;
var trainKey = formatter.pickTrainKeyFromModel(data.value, train);
that.getView().byId("trainName").setSelectedKey(trainKey);
that.setLocations();
var nameofPass = tempModel.getData().NameOfPsngr;
if (nameofPass === "" || nameofPass === null) {
that.getView().byId("nameOfP").setValue(tempModel.getData().Requestee);
}
},
error: function (err) {
console.log(err.message);
}
});
var fdate = new Date();
this.getView().byId("date").setDateValue(new Date());
this.getView().byId("date").setMinDate(fdate);
}
});
});
解决方案
如果您可以更改为oDataModel,则可以使用 resetChanges 方法。
如果你不能,你将不得不更多地手动完成。一旦弹出新窗口,保存用户将更改的数据,如果他取消它,则恢复保存在 jsonDataModel 上的数据。
推荐阅读
- jenkins - 如何从控制台输出中获取 Jenkins 成功构建的数据?
- java - 将数组列表附加到现有的 CSV 文件,但它会附加并清除存储在 Java 文件中的先前数据
- javascript - cy.get() 如何在 Cypress 中放置 2 个参数?
- excel - 选择索引集中的第二高行
- ruby - 为什么 Hash.new 中的默认数组需要键值规范?
- android - 底部导航栏的导航组件不起作用
- javascript - 正则表达式匹配数字+字符串
- javascript - 改变antd上传文件的位置
- java - libGDX 错误失败:构建失败并出现异常
- php - Laravel 8 - 在线支付 przelewy24 网关实现