У меня есть код, как это:Дождитесь загрузки завода, прежде чем разрешить
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;
}
каждому решить?
Как-то что-то асинхронно, вы не можете блокировать его, не вызывая проблем с пользовательским интерфейсом, так как это заблокировало бы все приложение от чего-либо. Можете ли вы изменить $ user, чтобы вместо этого дать обещание? – Enzey
@Enzey, Вы прочитали последнюю часть моего вопроса? –
@ShamilYakupov, как будет использоваться этот сервис '$ resolve'. И посмотрели ли вы на 'resol' свойство [' $ routeProvider.when'] (https://docs.angularjs.org/api/ngRoute/provider/$routeProvider#when)? –