2015-02-27 4 views
0

У меня есть код, как это:Дождитесь загрузки завода, прежде чем разрешить

meow.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { 
    $routeProvider 
    .when('/page', { 
     templateUrl: 'application/partials/page.html', 
     controller: 'index', 
     resolve: {'page': ['$resolve', function($resolve) {return $resolve.page();}]} 
    }) 
    .when('/page2', { 
     templateUrl: 'application/partials/page2.html', 
     controller: 'index', 
     resolve: {'page2': ['$resolve', function($resolve) {return $resolve.page2();}]} 
    }) 
    ... 
    .otherwise({ 
     redirectTo: '/error' 
    }); 
}]); 
meow.factory('$resolve', ['$q', '$user', function($q, $user) { 
    return { 
     page: function() { 
      var deferred = $q.defer(); 

      if ($user.logged()) { 
       $http.get('/json/page') 
       .success(function(data, status, headers, config) { 
        deferred.resolve(); 
       }) 
       .error(function(data, status, headers, config) { 
        deferred.reject(); 
       }); 
      } else { 
       deferred.reject(); 
      } 

      return deferred.promise; 
     } 
     page2:... 
     page3:... 
     ... 
    } 
}]); 

Как вы можете видеть, что есть проверка доступа пользователей в $resolve заводе: $user.logged(), но $user является асинхронной и при первой загрузке это может вызвать проблемы с доступом.

Вопрос заключается в том, как сделать все разрешимое решение $user?
У меня есть функция user_q(), которая дает обещание, но как ввести ее в мой код для всех разрешений? Или, может быть, какое-то другое решение с $routeChangeStart или $locationChangeStart событиями? Или я должен просто вставить $user.q().then(...) в каждое решение?

Update 1:
Мой код пользователя:

meow.factory('$user', ['$q', '$http', function($q, $http) { 
    var id = null; 
    var accesslevel = 0; 

    function update() { 
     var deferred = $q.defer(); 

     $http.get('/json/user') 
     .success(function(data, status, headers, config) { 
      if (data.logged) { 
       id = data.id; 
       accesslevel = data.accesslevel; 
      } else { 
       id = null; 
       accesslevel = 0; 
      } 
      deferred.resolve(); 
     }) 
     .error(function(data, status, headers, config) { 
      deferred.reject(); 
     }); 

     return deferred.promise; 
    } 

    var q = update(); 

    return { 
     logged: function() { return (id) ? true : false; }, 
     id: function() { return id; }, 
     accesslevel: function() { return accesslevel; }, 
     reset: function() { 
      id = null; 
      accesslevel = 0; 
     }, 
     update: function() { return q = update(); }, 

     q: function() { return q; } 
    }; 
}]); 

Не контроллер должен ждать $user.q(), решить должен. Когда я попытался сделать это как дополнительное решение в $routeProvider, page решил попробовать загрузить /json/page, но не должен до тех пор, пока $user.q() не будет разрешен и $user.logged() = true.

Таким образом, единственный способ, чтобы добавить

page: function() { 
     var deferred = $q.defer(); 

     $user.q().then(function() { 
      if ($user.logged()) { 
       $http.get('/json/page') 
       .success(function(data, status, headers, config) { 
        deferred.resolve(); 
       }) 
       .error(function(data, status, headers, config) { 
        deferred.reject(); 
       }); 
      } else { 
       deferred.reject(); 
      } 
     }); 

     return deferred.promise; 
    } 

каждому решить?

+0

Как-то что-то асинхронно, вы не можете блокировать его, не вызывая проблем с пользовательским интерфейсом, так как это заблокировало бы все приложение от чего-либо. Можете ли вы изменить $ user, чтобы вместо этого дать обещание? – Enzey

+0

@Enzey, Вы прочитали последнюю часть моего вопроса? –

+0

@ShamilYakupov, как будет использоваться этот сервис '$ resolve'. И посмотрели ли вы на 'resol' свойство [' $ routeProvider.when'] (https://docs.angularjs.org/api/ngRoute/provider/$routeProvider#when)? –

ответ

2

Как вы обычно зависимостями подход, как это было бы сделать user свою собственную решимость, а затем сделать другую решимость (а) зависят от него, как так:

resolve: { 
    user: function($user) { 
    return $user.q(); 
    }, 
    somethingElse: function(user, $otherService) { 
    // Whatever else 
    } 
} 

Это вид от, покрытых в UI Router wiki.

0

$ Пользователь может быть обещанием, которое разрешает все методы обслуживания, или вы можете разрешать каждую услугу отдельно.

Использование

$user.then(function(userService) { 
    userService.logged(); 
}); 

Разрешение

var userDeferred= $q.defer(); 
userDeferred.resolve({ 
    logged: function() { 
     return false; 
    } 
}); 
return userDeferred.promise; 
Смежные вопросы