Как перенаправить страницу Ember без рендеринга? - PullRequest
0 голосов
/ 25 марта 2019

У нас есть пользовательский интерфейс 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) вообще вызывает их рендеринг.

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

сделать перенаправление в хуке маршрутов приложения beforeModel. Крюк init услуг не то место. Лучше вызвать пользовательский метод на вашем сервисе из приложения beforeModel hook.

Может быть, посмотрите, как работают ember-simple-auth s mixins.

0 голосов
/ 03 апреля 2019
Хук

Ember beforeModel блокировал рендеринг пользовательского интерфейса со времен Ember 1.x, поэтому можно делать то, что вы хотите.

Однако, если вы делаете вызовы jQuery Ajax, вам нужно убедиться, что вы возвращаете Promise-совместимый Promise в ловушку.Исторически jQuery НЕ возвращал такой тип обещания (хотя это зависит от вашей версии jQuery и способа вызова ajax iirc).Стоит проверить, поскольку описываемое вами поведение соответствует возвращаемому обещанию

...