控制器在服务内操作对象时出现问题

Trouble with Controllers to manipulate an Object inside a Service

我有一个应该可以在许多控制器中访问的对象。

此对象在服务中,具有默认值,控制器稍后可能会更改这些值。

我的问题是我在服务中的对象保持控制器更改的值。

当控制器获取对象时,我总是希望它获取具有默认值的对象。 (不是之前由其他控制器修改过的值...)

我的服务中有这个:

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

我知道这是不正确的,因为 this.

所以我试着做了一个这样的方法:

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

并在我的控制器中调用 createMyObject(); 但这也不起作用。

我知道解决方案可能很明显。

谢谢。

如果您想要的是 myObject副本,您想要做的是:

var obj = angular.copy(myObject);

因为var obj = myObject;只会复制对象的引用,而不是它的内容。

Object in Javascript 除非复制或克隆,否则通过引用传递。所以当你在做

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

myObject 的引用正在分配给 obj 因此,obj 中的任何更改也会更新 myObject

考虑使用 angular.extend or angular.copy

this.createMyObject = function() {
  var obj = {};
  angular.copy(myObject, obj);
  // or
  // obj = angular.copy(myObject);
  return obj;
}

尝试以下解决方案:

服务代码:

.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 obj 的引用分配给 LHS。因此,对 LHS 对象的任何进一步更改也将反映到 RHS obj。