Angularjs - Как перенаправить в другое состояние, используя решатель - PullRequest
0 голосов
/ 10 мая 2018

Начните с того, что я совершенно новичок в AngularJS, и у меня нет большого опыта с ним.

Я пытаюсь перенаправить пользователей в другое состояние, используя resolve в состоянии маршрута. Мой код состояния маршрута такой:

const defaultTemplate = require('path-to-homepage-template/homepage.tpl');

module.exports = {
    states: [
        {
            state: 'homepage',
            config: {
                url: '/',
                templateUrl: defaultTemplate,
                title: 'homepage',
                controller: 'HomepageController',
                controllerAs: 'homepage',
                resolve: {
                    HomePageFormSeoResolver: 'HomePageFormSeoResolver'
                }
            }
        }
    ]
};

Тогда мой класс распознавателя выглядит так:

const AngularInjected = require('app_core/angular-injected');

class HomePageFormSeoResolver extends AngularInjected {
    static get $inject() {
        return [
            'Logger',
            'CONFIG',
            '$location',
            '$state',
            '$q'
        ];
    }

    constructor(...dependencies) {
        super(...dependencies);

        this._resolve();
    }

    /**
     * Responsible to check if the the get param `formSeo` exists and it's value
     * is `yes`
     * @private
     */
    _resolve() {
        const deferred   = this.deps.$q.defer();
        const get_params = this.deps.$location.search();

        // noinspection JSUnresolvedVariable
        if (
            typeof undefined !== typeof get_params.formSeo &&
            'yes' === get_params.formSeo
        ) {
            console.log('Here we are !!!!');
            this.deps.$state.go('signup-confirmation');

            deferred.resolve();
        }
        else {
            deferred.resolve();
        }

        return deferred.promise;
    }
}

module.exports = {
    init: ngModule => {
        ngModule.service(
            'HomePageFormSeoResolver',
            HomePageFormSeoResolver
        );
    }
};

Итак, когда я запускаю этот скрипт, я вижу в консоли браузера сообщение Here we are !!!!, но перенаправление не работает.

Я также попробовал в том же коде блога следующие высказывания:

deferred.reject();

или

return;

или

return false;

Итак, я не знаю, есть ли какое-либо другое решение для моего дела или я делаю что-то неправильно.

Вы видите что-то не так?

(Имейте в виду, что статический метод $inject() назначает все зависимости в свойстве класса deps.)

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете вернуть обещание из функции распознавателя, в котором будет указано, продолжать ли переход к состоянию или нет. Если вы решили перейти куда-то еще - отклоните обещание и укажите правильное состояние:

resolver($q, $state, $timeout, auth) {
    var deferred = $q.defer();

    // $timeout is an example; it also can be an xhr request or any other async function
    $timeout(function() {
      if (!auth.isLoggedIn()) {
        // user is not logged, do not proceed
        // instead, go to a different page
        $state.go('noLoggedInPath');
        deferred.reject();
      } else {
        // everything is fine, proceed
        deferred.resolve();
      }
    });

    return deferred.promise;
}

Я не уверен, что это так, но может быть полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...