在控制器之间共享数据[数组]

时间:2014-02-06 23:35:03

标签: angularjs

我需要在控制器之间共享数据。我的数据实际上是一个数组。我能够成功共享数据但我还有一个要求。我需要从一个控制器中清除这个数组。我在sharedService中编写了一个函数sharedService.clear()。但这不起作用。我在这里做错了什么?有人可以帮忙。

services.service('sharedProperties', function () {
   var sharedService =  {};

    sharedService.personArray = [];

    sharedService.setPersonArray = function(newObj) {
       this.personArray.push(newObj);
    };
    sharedService.getPersonArray = function(){
        return this.personArray;
    };

    sharedService.clear = function(){
        this.personArray = [];
    };
    return sharedService;

});

2 个答案:

答案 0 :(得分:4)

看起来您已经按照定义它的方式将工厂与服务混淆了。请尝试使用以下代码:

services.service('shareProperties', function() {
 this.personArray = [];

 this.clear = function() {
  this.personArray = [];
  }
});

另请参阅AngularJS: Service vs provider vs factory了解详情

答案 1 :(得分:3)

根据您的解释,您需要一个跨控制器共享人员的静态服务

services.service('sharedProperties', [function () {

    this.personArray = [];

    this.setPersonArray = function(newObj) {
       this.personArray.push(newObj);
    };
    this.getPersonArray = function(){
        return this.personArray;
    };

    this.clear = function(){
        this.personArray = [];
    };

}]);

引用this服务时,sharedProperties对象上声明的任何内容都将可用。使用var声明某些内容会使其成为sharedProperties范围内的私有内容,并且只能在服务中使用。

第一个示例getPersonArray中的

将返回对personArray的引用,我可以更改或修改sharedProperties的值,并参考personArray无论如何我想要访问方法很无意义。

因此,您可以改为保护personArray

services.service('sharedProperties', [function () {

    // private
    var personArray = [];

    this.setPersonArray = function(newObj) {
       personArray.push(newObj);
       return [].concat(personArray);
    };
    this.getPersonArray = function(){
        // will return a copy of the personArray at the time of request
        return [].concat(personArray);
    };    
    this.clear = function(){
        personArray = [];
        return [].concat(personArray);
    };

}]);

这样您只能使用自己的方法编辑私有personArray。但它确实需要您调用getPersonArray()来同步控制器之间的任何更改。

我倾向于使用factories作为实例对象或构造函数,而不是像对象一样使用静态。