#ember.js #ember.js-2
#ember.js #ember.js-2
Вопрос:
У нас есть пользовательский интерфейс Ember, который мы переносим на поставщика единого входа. Это стоит за флагом функции на стороне сервера, так что, когда флаг включен, пользователь перенаправляется на портал входа поставщика единого входа, а когда флаг выключен, пользователь все еще может войти через маршрут Ember.
У меня это работает с вызовом конечной точки сервера в вызове Ember Route beforeModel()
. Однако, поскольку это асинхронный вызов, рендеринг страницы продолжается до возврата запроса, результатов обработки и перенаправления браузера. Таким образом, пользователь может кратко просмотреть старую форму входа перед перенаправлением на портал единого входа. Я бы предпочел, чтобы пользователь видел только пустое окно браузера перед отображением портала единого входа.
Есть ли способ заставить метод Route beforeModel()
блокировать результаты вызова сервера? Я попытался выполнить явный вызов super.beforeModel()
только после обработки обратного вызова ajax, но Ember, похоже, не дожидается завершения этого, прежде чем продолжить рендеринг.
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) вообще запускает их рендеринг.
Комментарии:
1. Я бы заключил вызов ajax в другое обещание и использовал transition.abort() (см. документы ) перед перенаправлением на внешнюю страницу; Если перенаправление не должно произойти, обещание может разрешиться как обычно (и, вероятно, вызвать _super).
2. С тех пор я обнаружил, что
route.beforeModel()
это не обязательно определено в нашей версии Ember, и его вызов может привести к ошибке, зарегистрированной в консоли. Интересный совет поabort()
, я попробую позже сегодня.
Ответ №1:
выполните перенаправление в приложении routes beforeModel
hook. Перехват служб init
— это неподходящее место. Лучше вызовите пользовательский метод в вашем сервисе из хука «Маршруты приложений beforeModel
«.
Может быть, взглянете, как работают микшины ember-simple-auth.
Комментарии:
1. Хороший совет. Я нашел эту страницу документации, которая подтверждает вашу точку зрения о перенаправлении в маршруте: guides.emberjs.com/release/routing/redirection Тем не менее, я все еще получаю флэш-экран рендеринга формы. Мне все еще нужно выяснить, как заблокировать. Я отредактирую свой вопрос с помощью нового кода.
Ответ №2:
beforeModel
Хук Ember способен блокировать рендеринг пользовательского интерфейса с эпохи Ember 1.x, поэтому можно делать все, что вы хотите.
Однако, если вы выполняете Ajax-вызовы jQuery, вам нужно убедиться, что вы возвращаете обещание, соответствующее спецификации, в перехватчике. Исторически jQuery НЕ возвращал обещания такого типа (хотя это зависит от вашей версии jQuery и способа вызова ajax iirc). Стоит проверить, поскольку описываемое вами поведение соответствует возвращаемому не обещанию