当前位置: 首页 > 面试题库 >

AngularJS $ rootScope。$ broadcast在app.run中不起作用

潘俊楚
2023-03-14
问题内容

我在AngularJS
.run下有以下代码,该代码在我的本地开发计算机上可以正常运行,但在上传到客户端服务器后将无法工作…经过几次测试,很明显,在加载控制器时,事件并未尚未触发,因此取决于此事件的控制器中的大多数功能均无法正常工作。有人可以告诉我我在做什么错以及如何解决吗?谢谢

myApp.run(['AuthDataSvc', '$rootScope', function (AuthDataSvc, $rootScope) {    
    AuthDataSvc.getAuth().then(function(Token){
        $rootScope.$broadcast('Token', Token);
    }, function(status){
        console.log(status);
    });     
}]);

问题答案:

你总是要有一个比赛条件。我可以选择几种替代方法:

1)使用服务。我并不是这个选项的忠实支持者,因为它会导致产生Spaghetti代码。大多数情况下,您不希望控制器在登录之前运行。我喜欢选项2。

 myApp.run(['AuthDataSvc', '$rootScope', function (AuthDataSvc, $rootScope) {    
    AuthDataSvc.getAuth(); /* no op we will use the service to determine logged in */
}]);


/* inside a controller */
if(AuthDataSvc.isLoggedIn()){
      //do something.
}

2)使用route.resolve。解析是在路由上定义的,并且只有在将诺言设置为已解析后,Controller才会加载。我为您展示了一个示例ui- routerng-route您需要选择毒药。如果您不使用ui-router,则应考虑使用。

/* app.config ... route config.. */
var waitForLogon = {
      UserToken: ["AuthDataSvc", function (AuthDataSvc) {
         return AuthDataSvc.logon();
      }]
};

//this is for ng-route
 $routeProvider
   .when('/Book/:bookId', {
      templateUrl: '--',
      controller: 'MyCtrl',
      resolve: waitForLogon
   })


//this is for ui-router 
$stateProvider
     .state('me', {
            templateUrl: '--',
            controller: 'MeCtrl',
            resolve: waitForLogon
 })
/* controller */
 angular.module('yourapp')
    .controller('MyCtrl', ["UserToken", ... , function(UserToken){
                  //User Token will always be here when your Ctrl loads.
   });
/* service code -- */
angular.module('yourapp')
    .service('AuthDataSvc', ["LogonModel", "$q", function(LogonModel, $q) {
        this._q = null;
        var that = this;
        this._doAuth = function(){
           this.getAuth().then(function(Token){ that._q.resolve(Token) }, function(error){that._q.reject(error);}
        };
        this.logon = function () {
            if(!this._q){
              this._q = $q.defer();
               this._doAuth();// <-current auth do here, and resolve this._q when done
            }
            return this._q.promise;
        };
    });


 类似资料:
  • 问题内容: 试图找到AngularJS的一些基本信息,但是AngularJS文档并没有太大帮助。简单地说,我们为什么要使用它? 同样,在约翰·帕帕(John Papa)的Hot Towel模板中,通用模块中有一个自定义函数: 我不明白这是怎么回事。因此,这是几个基本问​​题: 1)怎么办? 2)和之间有什么区别? 问题答案: 怎么办? 正在通过应用程序范围发送事件。该应用程序的任何子级范围都可以使

  • 问题内容: 现在,之间的性能差异和已被淘汰,没有任何理由,更喜欢到? 他们是不同的,是的。 仅限于范围层次结构(向上)-如果它适合您的设计,这可能很好,但是在我看来,这是一个相当随意的限制。 在所有 选择 收听此活动的人中都有效,这在我看来是一个更为明智的限制。 我想念什么吗? 编辑: 为了对回答做出澄清,调度的方向不是我要解决的问题。向上调度事件,-向下调度事件。但是,为什么不总是使用它来覆盖所

  • 问题内容: 当我使用我的代码时,但是如果我使用$ http.post,则永远不会将参数获取到请求.php文件中。 这是服务功能: 和控制器功能: 和我的AJAXRequest.php文件 如果我使用 $ http.post() 输出 : 如果我使用 $ http.get(), 我的输出是: 我检查了FireBug工具中的帖子,该帖子将数据发送到我的php文件中。但PHP文件没有参数。 如果我使用

  • 问题内容: 如何使用以及在哪里使用?在模块定义之后,之后还是之后? 我采用的是BreezeJS Angular Q,它询问是否可以在函数中运行某些代码。 问题答案: 这是呼叫顺序: 指令的编译功能(如果在dom中找到) 指令的链接功能(同样,如果找到) 这是一个简单的演示,您可以在其中观看每个示例的执行情况(并根据需要进行实验)。 从Angular的模块文档中: 运行块 -创建注射器后执行,并用于

  • 我正在做angularJs和typescript项目。在启动客户端应用程序和加载UI之前,我必须进行同步http调用并从服务器获取一些数据。我在网上搜索,看到每个人都在谈论承诺,嗯,好吧,为什么不呢。所以我在app.run()中使用promise(调用$http并使用$q返回promise)。也许我没有错过什么,因为这根本不起作用。Angular启动app.config(),然后启动app.run