社区首页 >问答首页 >仅在AngularJS中完成初始化后才运行控制器

仅在AngularJS中完成初始化后才运行控制器
EN

Stack Overflow用户
提问于 2014-11-20 22:07:12
回答 1查看 14.8K关注 0票数 15

在我的AngularJS应用程序中执行任何控制器之前,我需要加载一些全局数据(即在AngularJS中全局解析依赖关系)。

例如,我有一个具有getCurrentUser()方法的UserService,它向后端服务器发出请求,以获取有关当前已验证用户的数据。我有一个控制器,它需要这些数据来启动另一个请求(例如加载用户的余额)。

我怎样才能做到这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 22:07:12

更新

如果可能,请考虑使用«Asynchronously Bootstrapping AngularJS Applications with Server-Side Data»文章中指定的方法。

您现在可以使用angular-deferred-bootstrap模块来实现这一点!

我不再确定这个答案的有效性,你仍然可以使用这些想法,但一定要用你的实际代码正确地测试它。我将努力使这个答案与never技术保持同步。

老答案

有几种方法可以解决异步应用程序初始化问题。

当涉及到在调用单个控制器之前必须解析的数据时-你可以很容易地使用ngRoute$routeProviderresolve选项。但是,当你需要在调用任何控制器之前加载一些全局数据时-你必须即兴发挥。

我已经尝试在这个答案中收集所有可能的解决方案。我按优先顺序提供它们。

1.使用ui-router

当使用ui-router而不是原生ngRoute时,您可以创建一个抽象根状态,并在激活子状态之前解析其中的所有数据。

我建议使用这种方法。ui-router提供了许多附加功能,包括分层解决依赖关系的能力,并被开发人员社区很好地接受。

示例

代码语言:javascript
代码运行次数:0
复制
module.config(function($urlRouterProvider, stateHelperProvider) {
    $urlRouterProvider.otherwise('/404');
    stateHelperProvider.setNestedState({
        name: 'root',
        template: '<ui-view/>',
        abstract: true,
        resolve: {
            user: function(UserService) {
                // getCurrentUser() returns promise that will be resolved
                // by ui-router before nested states are activated.
                return UserService.getCurrentUser();
            }
        },
        children: [{
            name: 'index',
            url: '/',
            templateUrl: '/partials/index'
        }, {
            name: 'not-found',
            url: '/404',
            templateUrl: '/partials/404'
        }, {
            name: 'balance',
            url: '/balance',
            templateUrl: '/partials/balance',
            resolve: {
                balance: function(UserService, user) {
                    // Using data resolved in parent state.
                    return UserService.getBalanceByAccountId(user.accountId);
                }
            }
        }]
    });
});

在使用抽象根作用域方法时,stateHelper将极大地帮助减少代码。

根作用域被定义为抽象的,因此不能直接激活,并且它没有URL。

template: '<ui-view/>'是正确呈现嵌套视图所必需的。

2.在根控制器中进行承诺

您可以做出承诺,并将它们添加到根控制器内部的函数中,即run()函数。

我创建了一个Plunk来演示这个想法:http://plnkr.co/edit/gpguG5Y2S4KOz1KOKzXe?p=preview

这是一个完美的解决方案,然而,它膨胀了代码,使其更难使用和理解(回调地狱)。只有当第一种方法对你不起作用时,我才会推荐它。

3.通过应用程序页面传递数据

您可以将所有初始化数据直接包含到服务器上生成的HTML页面中,并从您的应用程序访问它。

考虑这个例子:

代码语言:javascript
代码运行次数:0
复制
<html>

<body>

    <script src="application.js"></script>
    <script type="text/javascript">
        application.init({
            // Pass your data here.
            userData: { ... }
        });
    </script>

</body>

</html>

您还可以在自定义application对象的init()方法中手动引导AngularJS应用程序。

我真的不喜欢这种方法,因为我确实认为Web应用程序的前端和后端应该高度分离。理想情况下,你的前端应该是一个静态网站(例如,可以通过CDN交付的一堆HTML、CSS和JS ),而你的后端应该是一个严格的API服务器,没有表示层(即它应该对HTML、CSS等一无所知)。但是,如果您能够忍受应用程序组件之间的紧密集成,那么这是一个可行的解决方案。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27050496

复制
相关文章
为传统设备提供更好的视频编码
Netfilx 在全球目前已有约193M的会员,而人们会使用各种各样的流媒体设备,包括手机、智能电视、机顶盒以及游戏主机等。并且不同播放设备所处的网络环境也存在不同。因此就需要能够使用各种各样的编码配置和编码器来对不同的播放条件进行适配,以实现针对性的提供更加优质高效的视频服务。
用户1324186
2021/11/23
3750
Dropbox为微软Office提供原生云存储服务
北京时间11月5日消息,云存储服务提供商Dropbox宣布与微软达成协议,将对后者旗下的桌面、移动及网页版Office套件提供原生的云服务支持。同时,Office也将成为Dropbox用户编辑Word、Excel和PowerPoint等文档的标准应用。 根据协议,Dropbox的用户可以将其账户与微软Office的iPad应用建立关联,从而支持快速地文件视图、编辑并保存至云端。默认状态下,通过Dropbox网页应用实现的文件编辑可通过微软Office网页应用实现,保存在云端的文档无需回存至Dropbox。
静一
2018/03/20
2.4K0
(译)为容器提供更好的隔离:沙箱容器技术概览
既然主流 IT 工业都在采用基于容器的基础设施(云原生方案),那么了解这一技术的短板就很重要了。Docker、LXC 以及 RKT 等传统容器都是共享主机操作系统核心的,因此不能称之为真正的沙箱。这些技术的资源利用率很高,但是受攻击面积和潜在的攻击影响都很大,在多租户的云环境中,不同客户的容器会被同样的进行编排,这种威胁就尤其明显。主机操作系统在为每个容器创建虚拟的用户空间时,不同容器之间的隔离是很薄弱的,这是造成上述问题的根本原因。基于这样的现状,真正的沙箱式容器,成为很多研发工作的焦点。多数方案都对容器之间的边界进行了重新架构,以增强隔离。本文覆盖了四个项目,分别来自于 IBM、Google、Amazon 以及 OpenStack,几个方案的目标是一致的:为容器提供更强的隔离。IBM Nabla 在 Unikernel 的基础上构建容器;Google 的 gVisor 为运行的容器创建一个特定的内核;Amazon 的 Firecracker 是一个超轻量级的沙箱应用管理程序;OpenStack 将容器置入特定的为容器编排平台优化的虚拟机之中。下面对几个方案的概述,有助于读者应对即将到来的转型机会。
崔秀龙
2019/07/24
3.1K0
(译)为容器提供更好的隔离:沙箱容器技术概览
PHP取URL根域名的方法
PHP根据URL提取主域名,在网上荡了一个! 优化了一下域名库,修复了PHP7.0! 可以直接拿来用,测试了一下没发现问题! <?php  #使用示例 echo getBaseDomain('http
V站CEO-西顾
2018/06/09
6.2K1
为用户和开发者提供更好的评分和评价
作者 / Google Play 产品经理 Tom Grinsted、Scott Lin 和 Tat Yang Koh
Android 开发者
2022/03/10
7370
为用户和开发者提供更好的评分和评价
静态成员在PHP中是怎么继承的?
静态成员,也就是用static修饰的变量或者方法,如果搞不清楚它们实现的原理,就很容易会出现一些错误。这次我们来研究的是在继承中静态成员的调用情况。首先来看这样一段代码:
硬核项目经理
2020/02/17
1.4K0
腾讯云携手Commvault,为云上用户提供安全存储服务
11月2日获悉,腾讯云对象存储COS近日正式通过Commvault备份软件标准化测试,并获得官方认证。
云存储
2020/11/05
2.8K0
腾讯云携手Commvault,为云上用户提供安全存储服务
华为:用傲腾SSD提供更好的智能计算服务
过去多年,华为智能产品线得到了很大发展。华为智能计算产品线SSD业务总经理赵春辉介绍,今年Q1比去年同期增长70%以上,业务发展势头旺盛。这得益于公司在相关领域的技术投入,也离不开英特尔这样合作伙伴的帮助。
冬瓜哥
2019/06/10
7590
华为:用傲腾SSD提供更好的智能计算服务
在图像的傅里叶变换中,什么是基本图像_傅立叶变换
大家好,又见面了,我是你们的朋友全栈君。 从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。 傅立叶变换属于调和分析的内容。”分析”二字,可以解释为深入的研究。从字面上来看,”分析”二字,实际就是”条分缕析”而已。它通过对函数的”条分缕析”来达到对复杂函数的深入理解和研究。从哲学上看,”分析主义”和”还原主义”,就是要通过对事物内部适当的分析达到增进对其本质理解的目的。比如近代原子论试图把世界上所有物质的本源分析为原子,而原子不过数百种而已,相对物质世界的无限丰富,这种分析和分类无疑为认识事物的各种性质提供了很好的手段。 在数学领域,也是这样,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。”任意”的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类,这一想法跟化学上的原子论想法何其相似!奇妙的是,现代数学发现傅立叶变换具有非常好的性质,使得它如此的好用和有用,让人不得不感叹造物的神奇: 1. 傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子; 2. 傅立叶变换的逆变换容易求出,而且形式与正变换非常类似; 3. 正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取; 4. 著名的卷积定理指出:傅立叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段; 5. 离散形式的傅立叶变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT)). 正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。 傅立叶变换在图像处理中有非常非常的作用
全栈程序员站长
2022/09/27
1.4K0
PHP判断URL的合法性字符串是否为 URL 链接
前言: 有好多小伙伴在爬虫的时候,或者其他情况下无法精确判断一个字符串是不是一个标准URL链接地址从而很费脑,下面我么看一下怎么判断URL的合法性。 以下代码均为PHP语言代码,但语言都是相通的。 第
骤雨重山
2022/01/17
1.5K0
为同行提供服务:华为AP刷新固件,并且在AC中配置上线
昨天帮助同行远程调试华为的AC和AP,却总是断线,改了AC上面的VLAN1的管理IP,虽然AC不断线了,但是AP无法上线,提示版本不匹配。
IT狂人日志
2022/05/18
1.8K0
为同行提供服务:华为AP刷新固件,并且在AC中配置上线
PHP检测URL是否为域名格式
PHP判断这个域名是否是正确的域名,正确的url地址 1.正则 //检测域名格式 function CheckUrl($C_url){ $str="/^http(s?):\/\/(?:
V站CEO-西顾
2018/06/09
12.2K1
在 Php 中把 Allow_url_fopen 打開的風險[通俗易懂]
最近老是在我的 /tmp 裡頭, 發現有個多出來的 /tmp/cmdtemp 檔案. 也在 apache 的 error_log 中發現一些訊息如下:
全栈程序员站长
2022/09/13
2K0
数据库中存储的是什么?数据库存取的是地址
比如用户想看视频,用户通过浏览器访问视频网站的网址,视频网站服务器解析用户浏览器的请求(url),然后服务器访问视频网站的数据库服务器,从数据库服务器中得到该视频存放的地址(路径),然后返回给用户浏览器,用户浏览器再利用此地址访问该视频,即完成了一次查看视频的网络服务。
全栈程序员站长
2022/07/21
1.6K0
PHP的URL处理
完整URL地址: http://username:password@hostname/path?arg=value#auchor 协议:http:// 用户名和密码: username:passw
Java架构师必看
2021/03/22
3.8K0
在Flutter中设置更好的Logging的指南
今天,我们将研究可以极大减少应用程序调试时间的任务之一。一旦您习惯了在您的应用程序中以某种方式运行的日志,您将很快能够注意到为什么某些东西不起作用。您可以查看应用程序的流程,如果需要,还可以查看更多内容。
玖柒的小窝
2021/10/05
1.8K0
在Flutter中设置更好的Logging的指南
学习PHP中的URL相关操作函数
在日常的业务开发过程中,我们经常会有处理 URL 链接的需求,所以今天学习的函数其实都是大家经常会使用的一些函数。在之前的工作过程中,其实我对这些函数都只是有一个模糊的概念,知道,但是真要用得时候还是要看下文档才能确定真正要使用的是哪一个函数。因此,今天我们就当做是一次复习练习,主要是区分和搞清楚每个函数真正的用处。
硬核项目经理
2021/11/10
2.5K0
DataOps ETL 如何更好地为您的业务服务
据 Gartner Group 称,数据集成、迁移和商业智能项目在至少 70% 的案例中第一次尝试就失败了。商业组织产生(和要求)比以往任何时候都多的数据,但是,失败率令人震惊。在当今的任何业务中,ETL 技术都是数据分析的基础。数据仓库、数据集市和其他重要的数据存储库都加载了从事务应用程序中提取并转换为在商业智能应用程序中进行分析的数据。
DevOps云学堂
2022/10/04
4380
DataOps ETL 如何更好地为您的业务服务
点击加载更多

相似问题

在PHP中验证URL的更好方法

22

PHP图像上传存储为url

20

在php中路由URL的更好方法

13

使用PHP显示存储在SQL数据库中的URL图像

23

PHP -存储图像到数据库还是文件更好?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文