Angular ui-router: скрытые параметры и браузерная навигация - PullRequest
0 голосов
/ 28 августа 2018

Я работаю с AngularJS UI-Router для навигации в моем приложении. Я пытаюсь достичь чего-то немного «из коробки» с $stateParams в одном из моих состояний.

Объяснение

Государство - это вопрос, с несколькими вопросами подряд. Это определяется так:

$stateProvider
.state('myQuizz', {
   url:"/myQuizz/{title}",
   cache:false,
   params:{
     step: null
   },
   views: {
     'myQuizz-tab': {
       templateUrl: "myQuizz.html",
       controller: "myQuizzCtrl"
     }
   }
})
  • Параметр title появляется в URL-адресе и определяет, какие опросы проводит пользователь. Например: myApp.com / myQuizz / history .
  • Параметр step определяет, на каком этапе опроса находится пользователь (т.е. на какой вопрос, например, на вопрос 6 из 10). По умолчанию мой контроллер устанавливает его в 1, чтобы опрос начинался с первого вопроса.

Внутри контроллера Quizz происходит более или менее следующее:

$scope.submitAnswer = function(answer){
    if(isValid(answer, $stateParams.step)){ // If the answer was correct
        $stateParams.step = $stateParams.step + 1; // Increases step
        displayQuestion($stateParams.step); // Gets the next question in the quizz
    }
}

Поэтому каждый раз, когда пользователь отвечает на вопрос, он обновляет $ stateParams.step и обновляет экран, чтобы появился следующий вопрос.

Что я пытаюсь сделать

Теперь я хотел бы перемещаться между шагами с помощью кнопок браузера, предоставляя пользователю возможность вернуться назад. Давайте приведем пример:

  • Пользователь находится в другом состоянии, скажем, в меню викторины. // state "menu"
  • Пользователь открывает викторину. // state "myQuizz", step = 1, 1st question is displayed
  • Они правильно отвечают на первый вопрос, контроллер обновляет $ stateParams.step и отображает второй вопрос. // step = 2, 2nd question is displayed
  • Они хотят вернуться к первому вопросу, поэтому они нажимают кнопку «назад» в своем браузере. // step = 1, 1st question is displayed

Что происходит сейчас: когда они нажимают кнопку «назад», они переводятся в предыдущее состояние («меню»). Я подозреваю, что это потому, что когда $ stateParam.step обновляется, он не меняет URL (так как этот параметр скрыт).

Если бы $stateParams.step был нормальным параметром (не скрытым), он бы работал (я проверял). Но я не хочу, чтобы этот параметр появлялся в URL, вот где хитрость.

Мой вопрос

У меня вопрос: как включить навигацию в браузере, изменив только один скрытый $ stateParam в моем состоянии?

Что я пробовал до сих пор

  • Я пытался добавить

    $state.go('myQuizz', {title: $stateParams.title, step: $stateParams.step+1});

    в моем контроллере, чтобы браузер считал, что я изменил состояние. Никакого успеха с этим.

  • Я также пытался использовать $state.transitionTo, с тем же результатом.

  • Наконец, я попытался обновить состояние с помощью $ state.reload (). Это не работает по двум причинам: он заново запускает тест на первый шаг и перезагружает все изображения (которые я предварительно загружаю в начале теста), так что это не будет удовлетворительным подходом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...