首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >延迟控制器的执行,直到指定了rootScope值

延迟控制器的执行,直到指定了rootScope值
EN

Stack Overflow用户
提问于 2016-02-02 06:09:03
回答 2查看 680关注 0票数 1

情况是,我在(run)上有事件。该事件根据REST请求响应状态代码更改$rootScope.authenticated的值。

但是,当事件被触发时,我试图在我的控制器中将$rootScope.authenticated的值打印到控制台,它说它是“未定义的”值。

角跑:

代码语言:javascript
运行
AI代码解释
复制
pos.run(function($rootScope,$log,apiService){

// register event
$rootScope.$on('$routeChangeSuccess', function () {

    // call api function
    apiService.is_authenticated().then(
        function(response){

            if(response.status == "AUTHENTICATED"){
                $rootScope.authenticated = true;

            }else if(response.status == "NOT_AUTHENTICATED"){
                $rootScope.authenticated = false;
            }
        });       
    })
});

控制器:

代码语言:javascript
运行
AI代码解释
复制
// controller
pos.controller('TestController', function($rootScope,$scope,$http) {
    console.log($rootScope.authenticated);
});

它应该打印“真”或“假”。我知道它在控件执行后分配值,但是如何将控制器的执行延迟到指定的值为止?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-02 07:56:04

事实是,如果使用$promise模式,就永远无法保证执行的顺序,因为它是异步的,或者有足够的“安全”延迟。

你可能想换别的地方,一种方法是让它同步:

代码语言:javascript
运行
AI代码解释
复制
if (apiService.is_authenticated()){
   $rootScope.authenticated = true;
}

另一种方法是让$broadcast或$emit再次在“运行”中听一听。

代码语言:javascript
运行
AI代码解释
复制
$rootScope.$on("LOGIN_SUCCESSFUL", function () {
   $rootScope.authenticated = true;
});

你可以合并到$watch

或者使用http拦截器

更多的承诺和/或连锁承诺

有很多种方式,但这取决于你!

票数 2
EN

Stack Overflow用户

发布于 2016-02-02 08:07:48

最近研究了同样的解决方案,并在这里阅读了很多答案。其实有很多要找的,但没有一个被接受的答案对我有效。我找到了一个适用于最新ui路由器的解决方案,但它不被接受:

它是在preventDefault事件上调用一个stateChangeStart,然后您就可以完成您的承诺了。如果成功,则设置一个旁路标志,并再次转换到相同的状态,但由于旁路标志,它跳过了允诺/解决部分:

代码语言:javascript
运行
AI代码解释
复制
$rootScope.$on('$stateChangeStart', function (event, toState, toParams) {

    if($rootScope.stateChangeBypass || toState.name === 'login') {
        $rootScope.stateChangeBypass = false;
        return;
    }

    event.preventDefault();

    Auth.getCurrentUser().then(function(user) {
        if (user) {
            $rootScope.stateChangeBypass = true;
            $state.go(toState, toParams);
        } else {
            $state.go('login');
        }
    });

});

摘自:https://stackoverflow.com/a/28827077/2019281

我目前正在处理的另一个选项是使用根状态定义的解析对象。解决是完美的,因为它将阻止控制器初始化,直到承诺被解决或拒绝。您可以在拒绝时抛出一个错误,您可以在应用程序的run方法中捕获该错误:

国家定义:

代码语言:javascript
运行
AI代码解释
复制
$stateProvider.state('admin', {
    'url': '/admin',
    'controller': 'adminController',
    'templateUrl': 'admin.html'
    'resolve': {
        'auth': [
            '$q', 'Auth',
            function ($q, Auth) {
                return Auth.getCurrentUser().then(
                    function resolved (user) {
                        return (user) ? user : $q.reject('authRejected');
                    },
                    function rejected (user) {
                        return $q.reject('authRejected');
                    }
                });
            }
        ]
    }
});

App的运行方法:

代码语言:javascript
运行
AI代码解释
复制
$rootScope.$on('$stateChangeError', function (e, toState, toParams, fromState, fromParams, error) {
    if (error === 'authRejected') {
            $state.go('login');
    }
});

缺点是,您需要将根状态添加到要保护的状态,或者将该解决方案添加到要保护的每个状态。此外,您将始终需要在状态器上使用reload: true,以便在每个状态集上重新加载解决方案。

灵感来源:https://stackoverflow.com/a/24585005/2019281

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

https://stackoverflow.com/questions/35155678

复制
相关文章
函数中*的用法
0904自我总结 函数中*的用法 def fn(a, b, c, *, d=0, x): print(a) print(b) print(c) print(d) print(x) fn(10, 20, 30, x=30, d=100) 这里的*其实相当于一个分界线的作用,前面的是位置形参,后面是关键形参 * 前都是位置参数:无值位置必须赋值,有值位置可以不要赋值,必须在无值位置之后 * 后都是关键字参数:无值关键字必须赋值,有值关键字可以不要赋值,都是指名道姓传参,所
小小咸鱼YwY
2019/09/11
1K0
matlab中fprintf函数的用法举例_matlabfopen函数的用法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/02
6840
matlab中fprintf函数的用法举例_matlabfopen函数的用法
vector中find函数用法_java中set的用法
注意find不属于vector的成员,而存在于算法中,应加上头文件#include <algorithm>:
全栈程序员站长
2022/11/04
1.1K0
c语言findwindowex函数用法,VB中findwindowex函数的用法?
该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
全栈程序员站长
2022/09/03
8360
python中函数的基础用法
python中的内置函数提供了基础功能,在实际开发中,我们需要将这些基础功能进行搭配组合,来有效解决我们的问题。如何将我们自己构建的代码作为一个可复用的工具,最基本的方法就是写成函数。通过函数可以减少代码冗余,提高编码效率。在python中函数的基本定义如下
生信修炼手册
2020/05/12
6000
python中 apply()函数的用法
用途:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并肩元组或者字典中的参数按照顺序传递给参数
狼啸风云
2020/03/31
13.5K0
tensorflow中损失函数的用法
分类问题和回归问题是监督学习的两大种类。这一节将分别介绍分类问题和回归问题中使用到的经典损失函数。分类问题希望解决的是将不同的样本分到事先定义到的经典损失函数。分类问题希望解决的将不同的样本分到事先定义好的类别中。
狼啸风云
2019/01/18
3.8K1
python中count()函数的用法
?
py3study
2020/01/09
1K0
Python中lambda函数的用法
有过编程经验的小伙伴都知道,在其他编程语言如:C#,Java中都有lambda的身影。在Python语言中,同样也有lambda的身影,那就是lambda函数。
软件架构师Michael
2023/02/18
1.1K0
mysql中count()函数的用法
1.下面三种方式,在多数情况下效率是基本相同的,但问题在于,很多情况下,我们数据库可能有脏数据,比如重复数据,或者某条数据重要字段是null的,那下面的这几种,会把这种脏数据也统计上,本质都是统计满足条件的行数的:
IT云清
2019/01/22
3.5K0
python中range()函数的用法
python中range()函数可创建一个整数列表,一般用在for循环中. range()函数语法: range(start,stop[,step])  参数说明: star: 计数从star开始.默认是从0开始. stop: 计数到stop结束,但不包括stop. step: 步长,默认为1. 实例: >>>range(10) # 从 0 开始到 10,没有10 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 11) # 从 1 开始到 11
py3study
2020/01/18
9710
python中reduce函数的用法
reduce:将一个可以迭代的对象应用到两个带有参数的方法上,我们称这个方法为fun,遍历这个可迭代的对象,将其中元素依次作为fun的参数,但是这个函数有两个参数,那些作为参数呢?
用户7886150
2021/01/12
6060
Python中range()函数的用法
start:计数从start开始。默认是从0开始。例如range(5)等价于range(0, 5);
全栈程序员站长
2022/09/07
6710
Python中range()函数的用法
[1009]mysql中Cast()函数的用法
来源:https://blog.csdn.net/m0_37450089/article/details/80750994
周小董
2021/06/29
2K0
SQL中的max()函数用法
select max(score), name, course from score
zcqshine
2020/12/09
2.7K0
SQL中的max()函数用法
python中函数的进阶用法
python支持函数式编程范式,对于函数,还有更加高级的玩法,首先介绍高阶函数的概念。所谓高阶函数,就是可以将函数作为参数输入的一种函数。在python中,常用的高阶函数有以下几种
生信修炼手册
2020/05/12
5170
python中的eval函数的用法_isnan函数
  在Python中eval()函数的语法格式为eval(expression, globals=None, locals=None),注意后面还有globals参数和locals参数。eval()函数用于执行一个字符串表达式,并且返回该表达式的值。与eval相近的有exec函数,该函数将会在另一篇文章详细讲解。
全栈程序员站长
2022/11/01
1.2K0
[1004]mysql中的instr()函数的用法
如图,在abcd字符串中查找是否含有字符串b,返回的字符串位置是2. 说明instr()函数返回的位置是从1开始的,如果找不到则返回0
周小董
2021/06/24
2.4K0
python 中的enumerate()函数的用法
即对一个可遍历的数据对象(如列表、元组或字符串),enumerate会将该数据对象组合为一个索引序列,同时列出数据和数据下标。
Python学习者
2023/06/05
2600
点击加载更多

相似问题

节点-SASS编译器失败- CSS无效

14

SASS无效CSS

12

Sass中的CSS无效

40

Sass无效CSS错误:"expected“

20

节点Sass生成嵌套CSS

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档