我尝试在整个客户端会话中创建一个持久数组而不实际使用$ window.sessionStorage。现在,每当我改变路线时,阵列都会清空,即使它与我刚刚开启的路线相同。是否可以在不使用会话或localStorage的情况下使数据持久化?
var a = [];
把任何东西都塞进去:
a.push(b);
重新路由后的结果:[];
答案 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的适当范围的变量