SAPUI5复制模型并中断绑定?

sca*_*all 2 json sapui5

初始化时,我读取了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)

当我从复制模型中删除条目时,它也会从原始模型中删除条目,在这种情况下,这不是我想要的。

有什么建议么?

Qua*_*ure 5

更好的方法是将数据保存在成功处理程序中:

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为第二个模型的数据,它将不再具有对旧模型的引用。

希望这可以帮助!