将会话数据与其他角度指令和控制器同步



在我的AngularJS应用程序中,我有一个Session服务对象,其中包含当前用户、他们的首选项、他们所属的当前公司以及他们正在使用的当前主题等内容。我的应用程序中的许多地方在需要获取这些数据时都会引用会话服务。

因为这些变量在服务中,所以我不能使用范围监视来检测更改。因此,我决定使用观察者模式。应用程序中的各个位置,如其他服务、指令、控制器等,将向会话服务注册自己,并在会话更改时提供要执行的回调。

例如,如果用户更改了主题,则会通知使用自定义指令的index.html中的<style>元素,并且它将为新颜色重新创建所有覆盖的css规则。

例如,每当用户的化身被更新时,主菜单栏控制器将被通知刷新和重新绘制化身。像这样的东西。

显然,在各种控制器、指令等使用会话之前,会话中的数据必须至少刷新一次。要求会话服务获取会话数据的自然位置是应用程序级模块的run块。这很好用,但我也不认为这是最好的地方。

我注意到的一个问题是,当Firebug打开时,加载事物的异步性质会导致排序问题。例如,在<style>元素上运行的指令将在会话服务在应用程序的运行块中刷新后运行。。。这意味着按下F5后主题将不会更新,因为回调是在数据初始化后注册的。我必须在这里调用手动刷新以保持同步,但如果我这样做,它可能会在顺序不同的时间执行两次!这是个大问题。我不认为这个问题仅仅与萤火虫有关。。。这种情况在任何情况下都可能发生,但Firebug似乎总是会导致这种情况,这很糟糕。

概括一下。。。这种异步排序很好:

  1. 主题指令向会话注册回调
  2. 菜单栏应用程序控制器向会话注册回调
  3. .run块中调用会话.refresh()

这种异步排序很糟糕:

  1. 菜单栏应用程序控制器向会话注册回调
  2. .run块中调用会话.refresh()
  3. 主题指令将回调注册到会话,,但由于已经执行了Session.refresh(),因此不会执行回调

因此,与其使用观察器模式,或者通过run块刷新会话状态,设计服务等的最佳方式是什么?这样,会话数据将始终在应用程序的各个其他部分需要之后(或之前)进行刷新?是否有某种事件可以在指令和控制器而不是运行块执行之前执行?

如果我的方法总体上是合理的,我可以添加什么来真正使其按应有的方式工作?

谢谢!

在angular.js中,有两种使用全局变量的方法:

  1. 使用$rootScope
  2. 使用服务

使用$rootScope非常简单,因为您可以简单地将其注入任何控制器并更改此范围中的值。所有全局变量都有问题!服务是单身人士(你需要什么)!

我认为在你的情况下,你可以使用

$rootScope

$scope$观看

很好的答案

你不能像这样直接访问变量有什么原因吗:

app.factory('SessionService', function() {
var items = {
"avatar": "some url"
};
return items;
});
var MainController = [$scope, 'SessionService', function($scope, SessionService){
$scope.session = SessionService;
$scope.modifyAvatar = function(url){
$scope.session.avatar = "some new url";
};
}];
var HeaderController = [$scope, 'SessionService', function($scope, SessionService){
$scope.session = SessionService;
// You probably wouldn't do this, you would just bind
// to {{session.avatar}} in your template
$scope.getAvatar = function(){
return $scope.session.avatar;
};
}];

最新更新