SAPUI5复制模型和中断绑定?

时间:2015-04-24 10:20:15

标签: json sapui5

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

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

有什么建议吗?

2 个答案:

答案 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);

尝试一次。在http://api.jquery.com/jquery.extend/

找到参考