控制器无法操纵服务中的对象

时间:2016-05-23 09:44:26

标签: angularjs angularjs-service angularjs-controller

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

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

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

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

我在服务中有这个:

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

由于this.

,我知道这不正确

所以我尝试制作这样的方法:

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

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

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

感谢。

3 个答案:

答案 0 :(得分:1)

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

var obj = angular.copy(myObject);

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

答案 1 :(得分:1)

除非复制或克隆,否则Javascript中的

Object将按引用传递。所以当你做的时候

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

myObject的引用已分配到obj因此,obj中的任何更改也会更新myObject

考虑使用angular.extendangular.copy

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

答案 2 :(得分:1)

尝试以下解决方案:

服务代码:

.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。