Исходная модель изменяется при изменении скопированных данных в SAPUI5 - PullRequest
0 голосов
/ 25 февраля 2019

Я получаю некоторые данные (JSONArray) через API и сохраняю их в двух моделях и переменной массива.Я манипулирую данными в массиве, но он также меняет значения в моделях.Ниже приведены некоторые фрагменты кода:

 onInit : function(){
                this.addmodel = new sap.ui.model.json.JSONModel();
                this.addmodel.setDefaultBindingMode(sap.ui.model.BindingMode.OneWay);
                this.getView().setModel(this.addmodel, "Model");

                this.originalModel = new sap.ui.model.json.JSONModel();
                this.originalModel.setDefaultBindingMode(sap.ui.model.BindingMode.OneWay);
                this.getView().setModel(this.originalModel, "OrgModel");

                this.router.attachRoutePatternMatched(this._handleRouteMatched, this);
            },

Controller.js:

            _handleRouteMatched: function (evt) {
                if (evt.getParameter("name") !== "BookMeal") {
                    return;
                }

                $.ajax({
                    url: "/Non_sap_create_requests/odata/MealSelfLocMealType",
                    method: "GET",
                    dataType: "json",
                    success: function (data) {

                        that.mCopiedArray = $.extend([], data.value);
                        that.originalModel.setData(data);
                        that.addmodel.setData(data);

                    },
                    error: function (err) {

                    }
                });



            onFromDateSelect: function (oEvent) {

                if (Date.parse(fromDate) === Date.parse(currentDate)) {

                    var tempVal = that.mCopiedArray;
                    tempVal = formatter.mealContsraints(tempVal, currentDate, fromDate, currentTime, "null");
                    that.addmodel.setProperty("/value", tempVal);
                } else {
                    that.addmodel.setProperty("/value", that.originalModel.getProperty("/value"));
                }
            },

        });
    });

В приведенном выше коде я сохраняю данные в массиве mCopiedArray и в 2 моделях - addmodel и originalModel.Я манипулирую данными в formatter.js.Изменение данных в mCopiedArray также изменяет данные в addmodel и originalModel.

formatter.js:

        mealContsraints: function (value, currentDate, fromDate, currentTime, meal) {

            if (fromdate === currentdate) {
                while (ln--) {
                    if (value[ln].MealField === "Breakfast") {
                        value.splice(ln, 1);
                        break;
                    }
                }

                ln = value.length;

                if (currentTime > '11:30:00') {
                    while (ln--) {
                        if (value[ln].MealField === "Lunch") {
                            value.splice(ln, 1);
                            break;
                        }
                    }
                }

                ln = value.length;

                if (currentTime > '16:30:00') {
                    while (ln--) {
                        if (value[ln].MealField === "Eve Snacks") {
                            value.splice(ln, 1);
                            break;
                        }
                    }
                }

                if (currentTime > '18:00:00') {
                    while (ln--) {
                        if (value[ln].MealField === "Dinner") {
                            value.splice(ln, 1);
                            break;
                        }
                    }
                }

            }

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

$.extend([], data.value); создает , а не создает глубокую копию.Поэтому, если вы измените элемент в вашем массиве (например, измените MealField с Dinner на Midnight Snack), он также будет изменен в модели.

Но если вы измените сам массив (например, удалитеэлемент из массива), который должен не влиять на модель.

Я сделал небольшой фрагмент для этого:

const mData = {value: [
    { MealField: "Dinner", id: 3 },
    { MealField: "Lunch", id: 2 },
    { MealField: "Breakfast", id: 1 }
]};

const oModel = new sap.ui.model.json.JSONModel(mData);
const aCopy = $.extend([], mData.value);
aCopy.splice(1, 1);
// arrays should be different
console.log(aCopy);
console.log(oModel.getProperty("/value"));
aCopy[0].MealField = "Midnight Snack";
// single item should be the same
console.log(aCopy[0]);
console.log(oModel.getProperty("/value/0"));

Так что проблема не должна быть в формататорено что-то еще?

Кстати, ваш форматтер не форматер.Реальный форматер должен возвращать значение и не иметь побочных эффектов (таких как изменение моделей / данных).

0 голосов
/ 27 февраля 2019

Один из способов создания глубокой копии объекта - сериализация его в json и десериализация его в новый объект:

Let objString = JSON.stringfy (obj): Let newObject = JSON.parse(objString)

PS: это будет работать для сериализуемых свойств, и если у вас есть огромный объект, вы можете столкнуться с проблемами производительности.

0 голосов
/ 25 февраля 2019

Объекты работают с эталонной логикой, поэтому вы можете использовать jquery.extend (). enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...