在初始化时,我读取了一个oData服务以获取一个小的值列表,并将模型存储起来以便在应用程序中进一步使用。
sap.ui.getCore().setModel(oODataJSONModel, "xlist");
在多个阶段,我想制作原始模型的副本,更改值列表并在选择下拉列表中使用它。我尝试过多种不同的东西,但每次更新/删除复制的模型值时,它都会立即反映在原始模型中。这似乎是一个简单的问题,但是有没有办法打破原始模型和复制模型之间的联系,理想情况下我想保持原始列表的完整性,以便列表可以反复使用,无论发生什么变化是复制品?
var oModelCpy = new sap.ui.model.json.JSONModel();
var cpyModelArray = oOrigModel.getData();
cpyModelJsonData = { results : [ cpyModelArray ] };
oModelCpy.setData(cpyModelJsonData );
当我从复制模型中删除条目时,它还会从原始模型中删除条目,在这种情况下,这不是我想要的。
有什么建议吗?
答案 0 :(得分:4)
更好的方法是将数据保存在成功处理程序中:
oODataJSONModel.read("/yourService",
null,
null,
false,
function(oData, oResponse){
var oODataJSONModel = new sap.ui.model.json.JSONModel();
oODataJSONModel.setData(oData);
this.getView().setModel(oODataJSONModel, "jsonModel");
}
);
修改强>
我在浏览UI5问题列表的过程中偶然发现了这个问题,我突然意识到导致您的基础副本问题的原因! : - )
如果您将一个对象数组复制到一个新数组(如果将模型数据复制到另一个模型也会发生这种情况),您将无法获得新数组使用新对象
相反,您实际上会获得一个新数组,但使用引用来获取旧对象。因此,对模型1中数组内的对象中的值所做的任何更改最终都会在模型2中具有相同的值
因此,实际上,您需要根据旧对象创建新对象。幸运的是,您不需要昂贵的for
循环和硬编码的值复制逻辑来实现这一目标;一行就行了。
假设您的原始数据由数组aData
引用
然后使用JSON将此数据(真实副本)复制到新数组:
var aDataCopy = JSON.parse(JSON.stringify(aData));
如果您现在将此aDataCopy
设置为第二个模型的数据,则它将不再具有对旧模型的任何引用。
希望这有帮助!
答案 1 :(得分:0)
尝试使用jquery extend()方法制作数据副本。我之前遇到过类似的麻烦。
var newObject = $.extend({},oldObject);