У нас есть пользовательский интерфейс Ember, который мы портируем к провайдеру единой регистрации. Это скрыто за флагом функциональности на стороне сервера, так что, когда флаг включен, пользователь перенаправляется на портал входа в систему поставщика единого входа и, когда флаг отключен, пользователь все равно может войти в систему по маршруту Ember.
У меня это работает с вызовом конечной точки сервера в вызове Ember Route beforeModel()
. Однако, поскольку это асинхронный вызов, страница продолжает отображаться до возврата запроса, обработки результатов и перенаправления браузера. Таким образом, пользователь может кратко просмотреть старую форму входа, прежде чем он будет перенаправлен на портал единого входа. Я бы предпочел, чтобы пользователь отображал только пустое окно браузера перед показом портала единого входа.
Есть ли способ заставить метод Route beforeModel()
заблокировать результаты вызова сервера? Я попытался сделать явный вызов super.beforeModel()
только после обработки обратного вызова ajax, но Эмбер, похоже, не дожидается, пока это закончится, прежде чем продолжить рендеринг.
return Em.Route.extend(/** @lends application.LoginRoute# */{
beforeModel: function() {
var route = this;
return Ember.$.ajax(
'/ws/ssoEnabled',
{'success': function(json) {
Em.Logger.info("[LOGIN ROUTE] SSO Redirect information:", json);
if (json.isSsoEnabled === true) {
Em.Logger.info("[LOGIN ROUTE] Redirecting to", json.ssoRedirectUrl);
window.location.replace(json.ssoRedirectUrl);
return;
}
route._super.beforeModel();
},
'error': function(reason) {
Em.Logger.error("SSO detection failed", reason);
});
},
(Примерно так оно и есть; есть некоторые глобальные синтаксические сахарные вспомогательные методы, которые абстрагируют вызов Ember.$.ajax
.)
Блокирует ли загрузка модели рендеринг до загрузки? Я не решаюсь экспериментировать, поскольку на страницах входа в систему не определена модель, поэтому потребуется немного больше нового кода.
Приложение структурировано несколько странно. Страницы входа в систему на самом деле являются отдельным приложением в Ember v2.4, поэтому я могу подключиться к любой части кода приложения, не беспокоясь о том, чтобы сломать реальное приложение. Я также попытался подключиться к Приложению и вызвать только метод Ember.Application.create()
из разрешения обещаний вызовов сервера. Однако, похоже, что загрузка компонентов страницы входа (через RequireJS) вообще вызывает их рендеринг.