初始化时,我读取了oData服务以获取一小部分值,然后存储模型以供应用程序进一步使用。
sap.ui.getCore().setModel(oODataJSONModel, "xlist");
Run Code Online (Sandbox Code Playgroud)
在多个阶段,我想复制原始模型,更改值列表,然后在“选择”下拉列表中使用它。我尝试了多种不同的方法,但是每次我更新/删除复制的模型值时,它都会立即反映在原始模型中。这似乎是一个简单的问题,但是有没有办法打破原始模型和复制的模型之间的链接,理想情况下,我想保持原始列表完整无缺,以便可以反复使用列表,而不管发生什么更改被制作成副本?
var oModelCpy = new sap.ui.model.json.JSONModel();
var cpyModelArray = oOrigModel.getData();
cpyModelJsonData = { results : [ cpyModelArray ] };
oModelCpy.setData(cpyModelJsonData );
Run Code Online (Sandbox Code Playgroud)
当我从复制模型中删除条目时,它也会从原始模型中删除条目,在这种情况下,这不是我想要的。
有什么建议么?
更好的方法是将数据保存在成功处理程序中:
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");
}
);
Run Code Online (Sandbox Code Playgroud)
编辑
在浏览UI5问题列表时,我偶然发现了这个问题,这让我意识到是什么原因导致了您的底层复制问题!:-)
如果将对象数组复制到新数组(将模型数据复制到另一个模型时也会发生这种情况),则不会获得带有新对象的新数组
相反,您实际上将获得一个新数组,但带有对旧对象的引用。因此,您对模型1中数组内的对象中的值所做的任何更改最终都会在模型2中具有相同的值
因此,实际上,您需要在旧对象的基础上创建新对象。幸运的是,您不需要昂贵的for
循环和硬编码的值复制逻辑即可实现此目的。一行就可以了。
假设您的原始数据是由array引用的aData
。
然后,您可以使用JSON将数据(真实副本)复制到新数组中:
var aDataCopy = JSON.parse(JSON.stringify(aData));
Run Code Online (Sandbox Code Playgroud)
如果现在将其设置aDataCopy
为第二个模型的数据,它将不再具有对旧模型的引用。
希望这可以帮助!
归档时间: |
|
查看次数: |
5714 次 |
最近记录: |