Проблемы с контроллерами для управления объектом внутри службы

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

Этот объект находится внутри службы, имеет значения по умолчанию, и контроллер может изменить эти значения позже.

Моя проблема в том, что мой объект внутри службы сохраняет значения, измененные контроллерами.

Когда контроллер получает объект, я всегда хочу, чтобы он принимал объект со значениями по умолчанию. (не со значениями, ранее измененными другим контроллером до ...)

У меня это внутри моего сервиса:

this.myObject = {'item1' : 'something', 'item2' : 'other' , .....};

Я знаю, что это неправильно из-за this.

Итак, я попытался сделать такой метод:

this.createMyObject = function() {
  var obj = myObject;
  return obj;
}

И вызываю createMyObject(); в моих контроллерах, но это тоже не работает.

Я знаю, что решение может быть очевидным.

Спасибо.


person Emidomenge    schedule 23.05.2016    source источник


Ответы (3)


Если вам нужна копия myObject, вы хотите сделать следующее:

var obj = angular.copy(myObject);

Потому что var obj = myObject; просто скопирует ссылку на объект, а не его содержимое.

person Neozaru    schedule 23.05.2016

Object в Javascript передаются по ссылке, если не копируются или не клонируются. Итак, когда вы делаете

this.createMyObject = function() {
  var obj = myObject;
  return obj;
}

Ссылка myObject назначается obj, поэтому любое изменение в obj также обновит myObject.

Рассмотрите возможность использования angular.extend или angular.copy

this.createMyObject = function() {
  var obj = {};
  angular.copy(myObject, obj);
  // or
  // obj = angular.copy(myObject);
  return obj;
}
person Shashank Agrawal    schedule 23.05.2016

Попробуйте следующее решение:

Сервисный код:

.service('MyService', function() {
    var myObject = {
                    'item1': '',
                    'items2': ''
    };


    /**
     * Used to return copy of myObject with some default values
     */
    this.createMyObject = function() {
        return angular.copy(myObject);
    };

    this.alterMyObject = function() {
        // @TODO here myObject can be used to edit directly
    };
});

Примечание: оператор «=» между двумя объектами используется только для присвоения ссылки объекта RHS объекту LHS. Таким образом, любые дальнейшие изменения с объектом LHS будут также отражены в объекте RHS.

person Suneet Bansal    schedule 23.05.2016