gpt4 book ai didi

angularjs - 处理非平凡的AngularJS应用程序初始化要求的最佳实践?

转载 作者:行者123 更新时间:2023-12-02 23:37:17 27 4
gpt4 key购买 nike

我有一个应用程序,它具有一些特定的(非平凡的)初始化要求,并且尚不清楚哪种最佳实践解决方案是真的。很抱歉,无法显示文字。问题本身并不那么复杂,但是我需要确保我的推理清楚。

首先,应用程序本身:


它具有用户身份验证,尽管仅在两个时间点被强制执行:

第一次加载应用程序(第一次)。我将在其余问题中将此要求称为(1)。
与服务器端交互时,根据需要。我已经使用类似于http://ngmodules.org/modules/http-auth-interceptor的方法解决了这一部分,尽管这是一个自定义解决方案(这是必需的,因为应用程序需要使用一些我不想依赖于Angular的服务)。在其余的问题中,我将这个要求称为(2)。

有两个与此问题相关的控制器:

导航栏控制器(已固定,未绑定到视图)。
控制器已应用于使用的视图(ng-view)。

它是使用angular.bootstrap手动启动的。


此问题与用户身份验证处理有关。用户必须根据需要进行身份验证的要求(2)已解决。目前,它的处理方式如下:


我的Angular服务模块之一执行了一些服务器端请求。如果所应用的身份验证令牌已过期(或不完全存在),则该请求可能会导致401响应。
发出请求的应用程序服务模块发现401响应,并应用$ rootScope。$ broadcast('app:auth')。
通过$ scope。$ on('app:auth')的某些代码来获取身份验证广播,显示一个模式身份验证对话框,然后确保原始服务请求的承诺已解决/被拒绝(如果用户在对话)。


要求(1)和(2)之间的唯一区别是(1)应该是强制身份验证对话框(用户不能简单地使用“取消”或“ esc”按钮拒绝它),并且(1)应该早于在应用程序初始化中尽可能。

现在,我的问题是关于要求(1),实际上是Angular最佳实践。我可以通过几种方法做到这一点:


完全在Angular之外执行此一次性身份验证。显然,这里的缺点是我必须为模式对话框和初始化编写本质上重复的逻辑。其中一些可以共享,但不能全部共享。
在应用程序的某些特殊(固定)控制器(如导航栏控制器)中执行此一次性身份验证。
在angular.module.run中执行此一次性身份验证。


显然,此处的目的是在用户(或应用程序)触发应用程序中的其他内容之前对用户“强制”认证。

我很想使用数字(3),因为这样我就可以重用需求(1)已经使用的所有代码。但是,您随后遇到了将事件侦听代码放置在何处的问题。此时,尚未启动任何控制器/应用程序的各个部分(仅完成注入)。

如果我将身份验证事件的逻辑放在应用程序控制器中,那么该控制器甚至不会在此时启动,因此将无法向该事件注册。如果将$ rootScope。$ broadcast放置在$ timeout内且延迟为0,则导航栏控制器已启动,但视图绑定控制器未启动。如果我将$ rootScope。$ broadcast放入具有100毫秒延迟的$ timeout内,则两个控制器都已启动(在我的计算机上)。

问题显然是我需要使用的延迟量取决于计算机以及事件处理程序代码所处的范围。它还可能取决于Angular初始化整个DOM中找到的控制器的顺序。

(3)的替代版本也可能是在angular.module.run中执行$ rootScope。$ broadcast,并将事件侦听器附加到$ rootScope本身。我倾向于这是最简单的方法。

请参阅以下插件(仅尝试突出计时问题):http://plnkr.co/edit/S9q6IwnT4AhwTG7UauZk

实际上,所有这些都归结为以下最佳实践问题:

应用程序级代码和非平凡的应用程序初始化代码应真正放置在哪里?我应该将$ rootScope视为实际的“应用程序”吗?

谢谢!

最佳答案

简短的答案:

应用程序范围的代码应在服务中。

应用程序初始化代码应位于run块中。

更长的答案:

应在服务中定义应用程序级代码,例如您的身份验证。该服务应公开API,您的应用程序的其余部分可以与之交互以完成该任务。当然,服务的工作是隐藏实现细节。服务本身应该照顾从(最初)获取身份验证信息的位置-可能是从cookie,可能是从本地存储或会话存储。。或者甚至是进行http调用。但是所有这些都封装在该身份验证服务中。

因为现在您已经编写了一个单独的服务,并且可以将inject内容放入您的运行块中,所以一切都很好。您真的不需要$rootScope$rootScope是另一个注入的服务。但是,因为它参与了脏检查机制,并且似乎该服务不需要。.您不需要为此额外的任务负担$ rootScope。它不是它的工作,也许可以将其委派给其他服务,其唯一任务是身份验证。由于您的服务也是单例服务,因此在维护状态方面也非常出色。您也许可以设置一个标志,如isAuthenticated之类的标志,以后可以根据需要进行检查。

哦,您的模态之间也应该有一个服务。如果您还没有,请参见Angular UI中的$ dialog服务。这意味着身份验证可以直接与$dialog服务一起使用。

关于angularjs - 处理非平凡的AngularJS应用程序初始化要求的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16318108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com