scarra_ball
scarra_ball

Reputation: 63

SAPUI5 copy model and break binding?

On initialization I read an oData service to get a small list of values and I store the model for further use in the application.

sap.ui.getCore().setModel(oODataJSONModel, "xlist");

At multiple stages, I want to make a copy of the original model, make changes to the values list and use it in a Select drop down. I've tried multiple different things, but every time I update/delete the copied model values, it is instantly reflected in the original model. This seems like a simple ask, but is there a way to break the link between the original model and the copied model, ideally I want to keep the original list intact so that list can be re-used over and over, regardless of what changes are made to the copies?

            var oModelCpy = new sap.ui.model.json.JSONModel();

            var cpyModelArray = oOrigModel.getData();

            cpyModelJsonData = { results : [ cpyModelArray ] };

            oModelCpy.setData(cpyModelJsonData );

When I remove entries from the copy model, it also removes entries from the original model, which in this case is not what i want.

Any suggestions?

Upvotes: 3

Views: 9776

Answers (2)

Qualiture
Qualiture

Reputation: 4920

A better approach is to save your data in the success handler:

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");
  }
);  

EDIT

I just stumbled upon this question while I was browsing through the list of UI5 questions, and it dawned to me what is causing your underlying copy issue! :-)

If you copy an array of objects to a new array (which is also happens if you copy model data to another model), you won't get a new array with new objects

Instead, you actually will get a new array, but with references to the old objects. So any change you make to a value in an object inside an array in model 1, will end up having that same value in model 2

So, in effect, you need to create new objects based on the old ones. Luckily, you don't need costly for loops and hardcoded value-copying logic to achieve this; one single line should be ok.

Let's say your original data is referenced by an array aData.
You then copy this data (a true copy) to a new array using JSON:

var aDataCopy = JSON.parse(JSON.stringify(aData));

If you now set this aDataCopy as the data for your second model, it will not have any references to the old model anymore.

Hope this helps!

Upvotes: 6

Try using jquery extend() method to make a copy of the data. I had similar troubles earlier.

var newObject = $.extend({},oldObject);

Try this for once. Find the reference at http://api.jquery.com/jquery.extend/

Upvotes: 0

Related Questions