- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,它具有一些特定的(非平凡的)初始化要求,并且尚不清楚哪种最佳实践解决方案是真的。很抱歉,无法显示文字。问题本身并不那么复杂,但是我需要确保我的推理清楚。
首先,应用程序本身:
它具有用户身份验证,尽管仅在两个时间点被强制执行:
第一次加载应用程序(第一次)。我将在其余问题中将此要求称为(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/
我有一个类和构造函数,如下所示: def init(log, edge): if edge: return Helper(log, edge) return Booka
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
有人知道在 mongo 上安装标准 ubuntu 需要多少磁盘空间和内存吗?试图找出我的 VPS 需求... 最佳答案 没有最低要求,但我不建议在与您的网络服务器相同的机器上运行 Mongo。 Mon
我的 Django 项目有一个虚拟环境,但是当我 pip 击 pip freeze 时,我得到了一个必须是全局站 pip 包列表的东西,包括太多包,比如ubuntu包和这么多不相关的东西。无论 vir
我曾尝试在 Heroku 上部署我的应用程序,但 smth 出错了。 错误:找不到满足要求的版本 get==2019.4.13(来自 -r/tmp/build_53ad6d03_/requiremen
我无法将 semantic-ui-calendar npm 模块加载到我的应用程序中。 我已经使用脚本标签成功地将它加载到我的 HTML 中, 但每次我尝试将它加载到我的应用程序中时,我都会出错。 在
如何修复 php.ini 中“require”函数内的地址?它进行故障排除并显示错误: 警告:require (..) 无法打开流:没有这样的文件或目录。 文件“db_connection.php”工
我有一个在 Node.js 应用程序中使用的外部库 ( Objection.js )。我创建了一个基本模型类,它为我的实体模型扩展了 Objection 的 Model 类: const { Mode
有谁知道在哪里可以找到RHEL5的GLIBC2.7,如果没有这个,Android模拟器将无法启动。它会给出一条消息,要求GLIBC 2.7或更高版本。 我尝试在网上搜索,但没有找到 最佳答案 我也遇到
Android 设备是否有任何要求/指南?例如按钮数量或所需的最少按钮数量。 还有没有菜单和后退按钮的安卓设备吗? (我知道就可用性而言,没有菜单/后退按钮会杀死大多数应用程序,我只是想了解更多有关该
我想要求/包含一个文件并将其内容检索到一个变量中。 test.php index.php ".$test; ?> 类似于 file_get_contents() 但它仍应执行 PHP 代码。这可能吗
我想要求/包含一个文件并将其内容检索到一个变量中。 test.php index.php ".$test; ?> 类似于 file_get_contents() 但它仍应执行 PHP 代码。这可能吗
我正在尝试在我的 Linux Mint 发行版上安装一个 python 模块“pyAudioProcessing”(https://github.com/jsingh811/pyAudioProces
我已经创建了我的第一个 composer 包,它具有 MySQL 和 MongoDB 的功能,但是,它不需要两者。我意识到有人可能只想将这个包与两个数据库之一一起使用,目前我有: "require":
我想调试以下函数,但假设在调试器中查看 moreajaj 的参数等于什么(假设不像在这个人为的示例中那么明显)是有用的。我可以在调试器框架中打印它,但是在每个参数的每个框架中都这样做很烦人。在宣布每一
我有一些生成的 GNUmakefiles,我需要从中提取变量的值。 有没有一种简单的方法可以在不修改 makefile 的情况下查看变量的值? 仅供引用,变量包含 emacs c-macro-expa
我正在使用 aspell 在 Linux 上拼写检查 LaTeX 文档。我的文档经常包含各种编程语言的代码示例,我希望 aspell 在拼写检查时简单地跳过这些行。 我可以在文档中写些什么来关闭一段文
我有一个包含多个列的数据集... 一列是具有重复值的主石斑鱼列,另一列是具有 bool 值 (1,0) 的 NUMBER,如下所示: grp bool --- ---- A 1 A 1 A
出于测试目的,我正在尝试删除一些 amd 模块并从服务器重新加载更新版本 - 目的是不刷新浏览器。 我目前正在执行以下操作,但浏览器仍然没有从网络重新加载项目。 var scripts = docum
当我键入irb> require 'rubygems'时,它返回false。我的Rails应用程序中有很多 gem ,这些 gem 显然可以正常工作-耙子,activerecord等。这里可能出什么问
我是一名优秀的程序员,十分优秀!