javascript - ajax返回时的 Angular 加载路由

标签 javascript angularjs ajax

如何延迟/延迟路由/ Controller 直到匿名函数返回?在应用程序 Bootstrap 中,我默认 rootScope.me 作为 guest 帐户,直到它可以检查登录用户的 cookie。

我有一个 Controller testCtrl,它依赖于 rootScope.me 数据来加载适当的用户数据。 Controller 在 rootScope.me 有机会设置给用户之前触发。

我知道 Angular 有 $q解决 promise 的服务,但我不确定如何将其应用于路由。

angular
    .module('DDE', [])
    .run(['$rootScope', 'Me', function($rootScope, Me) {

        $rootScope.me = {
            username : 'Guest',
            id : -1
        };

        if (Cookies.get('user_id') && Cookies.get('username')) {
            Me.getProfile({user_id : Cookies.get('user_id')}).success(function (res) {
                $rootScope.me = res;
            }).error(function (err) {
                console.log('Error: ', err);
            });

        }
}])
.config(['$routeProvider', '$httpProvider', '$authProvider',
           $routeProvider.
                when('/test', {
                    templateUrl: '/html/pages/test.html',
                    controller: 'testCtrl'
                }).

.config(['$routeProvider', '$httpProvider', '$authProvider', '$stateProvider', '$urlRouterProvider',
    function($routeProvider, $httpProvider, $authProvider, $stateProvider, $urlRouterProvider) {

       //Cannot inject services like Me or $rootScope as I need

        function loadProfile () {
            Me.getProfile({user_id : Cookies.get('user_id')}).success(function (res) {
                $rootScope.me = res;
            }).error(function (err) {
                console.log('Error: ', err);
            });
        }

        $stateProvider.
            state('test', {
                url : '/test',
                templateUrl: '/html/pages/test.html',
                controller : 'testCtrl',
                resolve : {
                    ProfileLoaded : function () {
                        return loadProfile();
                    }
                }
            });

最佳答案

编辑:添加 angular 的 ngRoute 示例。

你可以看看ui-router's resolve .它基本上是在加载/导航到您的州/路线之前等待您的 promise 得到解决。

文档

Each of the objects in resolve below must be resolved (via deferred.resolve() if they are a promise) before the controller is instantiated. Notice how each resolve object is injected as a parameter into the controller.

这是来自 angular's documentation 的 Angular 的 ngRoute 示例:

.config(function($routeProvider, $locationProvider) {
  $routeProvider
   .when('/Book/:bookId', {
    templateUrl: 'book.html',
    controller: 'BookController',
    resolve: {
      // I will cause a 1 second delay
      delay: function($q, $timeout) {
        var delay = $q.defer();
        $timeout(delay.resolve, 1000);
        return delay.promise;
      }
    }
  })

关于javascript - ajax返回时的 Angular 加载路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34559117/

相关文章:

javascript - promise - TypeError : Cannot read property 'then' of undefined

javascript - 如何安全地执行操作,然后从 .txt 文件中异步插入 250,000 多个单词,而不会导致堆栈溢出?

javascript - 如何使用 angularjs 遍历 JSON 对象

c# - 使用 AJAX 过滤 GridView (ASP.NET/C#)

ajax - 在浏览器中捕获服务器端 ajax 处理错误

javascript - 每个 addEventListener 是否都需要一个 removeEventListener 来防止 Appcelerator 中的内存泄漏

javascript - 如何忽略基于javascript的转换

javascript - 在 Controller 上注入(inject) ui-router 解析结果

java - Servlet 以 HTML 而不是 JSON 的形式返回响应

javascript - 仅当一系列 XHR (IO) 请求成功时,调用 YUI3 中函数的最佳方法是什么?