Javascript 使用angularjs应用程序登录后加载初始数据

Javascript 使用angularjs应用程序登录后加载初始数据,javascript,angularjs,Javascript,Angularjs,我有一个完全独立(从后端)的AngularJS应用程序。它使用令牌(JWT)进行身份验证。我也在使用ui路由器和重启语言 我的问题是: 我有一个侧边栏/配置文件区域,在每个“页面”上显示当前登录用户的信息。它作为指令+控制器实现,并且在ui视图指令上下文之外。在这个侧边栏的控制器内部,我请求获取配置文件信息并将其附加到$scope。现在,当用户第一次访问应用程序时,会调用侧栏和控制器,并请求获取配置文件信息。但是,如果用户未登录,请求将失败,并且没有数据绑定到$scope 同时(注意这一切发生得

我有一个完全独立(从后端)的AngularJS应用程序。它使用令牌(JWT)进行身份验证。我也在使用ui路由器和重启语言

我的问题是: 我有一个侧边栏/配置文件区域,在每个“页面”上显示当前登录用户的信息。它作为指令+控制器实现,并且在ui视图指令上下文之外。在这个侧边栏的控制器内部,我请求获取配置文件信息并将其附加到
$scope
。现在,当用户第一次访问应用程序时,会调用侧栏和控制器,并请求获取配置文件信息。但是,如果用户未登录,请求将失败,并且没有数据绑定到
$scope

同时(注意这一切发生得非常快),事件侦听器(从ui路由器侦听$stateChangeSuccess)确定用户未登录(基本上如果他们没有令牌),并执行
$state.go('login')
将用户转发到登录视图。用户登录后,会调用一个
$state.go('dashboard')
,将其带回仪表板。然而,由于侧栏不在路由器的上下文中,因此不会再次实例化它的控制器以引起对配置文件信息的新请求。因此侧边栏是空的,没有配置文件信息

我知道有几种可能的解决办法,但我正在努力寻找一种

为了解决或避免我遇到的问题,您将如何设计一个angular应用程序?


另外,我想我可能对这个问题的分析陷入瘫痪。

如果没有看到你的代码,我很难回答。如果我正确理解您的指令在用户登录之前触发,并且由于没有用户配置文件,侧栏无法正确启动。我建议可能在触发指令的标记上执行ng if,例如:

<side-bar ng-if='userData' />


这样,在userData存在之前,标记不会插入DOM,因此不会在登录页面上触发指令。

假设边栏是应用程序中角度最高的控制器,并且其他控制器嵌套在其中,您应该能够在边栏上放置一个函数,该函数将加载你需要。然后,您可以在注入$rootScope的任何位置调用$rootScope.loadme()

var mainMod = angular.module('mainMod',[]);

mainMod .controller('mainController', function($scope)
{
$scope.loadMe = function() 
{
//load stuff here
};
$scope.loadMe();
});


mainMod .controller('secondController', function($rootScope, $scope)
{
$rootScope.loadMe();
});

SudoCode可能不会与复制粘贴一起工作,但这个想法应该是合理的。

hmm,在我的例子中,侧栏自己的控制器请求“userData”明白了,它不必是“userData”,它可以是“主控制器”上的一个标志(userIsLoggedIn),当用户成功登录时设置为true。如果您没有共享的父控制器,则需要将其放入服务中,以便在控制器之间共享变量。有一个ng应用程序模块,从技术上讲,它是最为父控制器的模块。我正在(“$stateChangeSuccess”)上使用带$rootScope.$on的.run()函数。我没有为此应用程序模块定义控制器,因为我还不需要控制器,但这很容易实现。或者,您可以创建一个服务/工厂,在所有其他位置注入。我的所有模块都至少有一个控制器,因此我没有没有没有控制器的经验。