Angular Factory中的持久数组可能吗?

时间:2015-06-02 16:45:39

标签: arrays angularjs

我尝试在整个客户端会话中创建一个持久数组而不实际使用$ window.sessionStorage。现在,每当我改变路线时,阵列都会清空,即使它与我刚刚开启的路线相同。是否可以在不使用会话或localStorage的情况下使数据持久化?

var a = [];

把任何东西都塞进去:

a.push(b);

重新路由后的结果:[];

2 个答案:

答案 0 :(得分:2)

我建议使用服务。 AngularJS中的服务是单例 - 意思是,可以在整个应用程序中注入相同的实例。

这比使用$rootScope的替代方案更好,因为它“污染”了范围,也不利于使用模拟注射剂进行测试。它几乎没有比使用全局变量更好。

您可以创建一个包含该数组的可注入值:

app.value("AVal", []);

这就足够了。当然,如果您创建了一个服务,它将允许您抽象出数据结构的细节:

app.factory("ASvc", function(){
  var a = [];

  return {
    add: function(val){
       a.push({v: val})
    },
    pop: function(){
      var item = a.splice(a.length - 1, 1);
      return item[0].v || null;
    }
  };
});

但是,您选择这样做,两者都可用作注射剂,例如:

app.controller("MainCtrl", function($scope, AVal, ASvc){
   AVal.push({v: 5});

   // or
   ASvc.add(5);
});

答案 1 :(得分:-1)

您的控制器功能将在路线更改时重新运行,每次都清除您的本地变量。有一些方法可以在这里给猫咪留一些东西,但对于类似这样的东西,我建议使用$rootScope,这是一个特殊的顶级控制器,除非整个应用程序刷新,否则不会重新运行。

// controller
function WhateverController ($scope, $rootScope) {  
  // create array if one doesn't exist yet
  $rootScope.persistentArray = $rootScope.persistentArray || []
  $rootScope.persistentArray.push('Heyoo')

  $scope.localArray = $rootScope.persistentArray   
}

$rootScope也可以传递给工厂(非常肯定),但你也可以通过一个典型的工厂实现你想要的东西,使用带有getter / setter的适当范围的变量