2015-05-27 3 views
1

Мое приложение автоматически запускается в состоянии по умолчанию (с URL: «/»), очевидно. Назовем это A.Угловой - динамически Выберите начальное состояние

Я хочу сдержать это в случае, если определенное условие является правдивым. Это означает, что если, например, x === 4, то я хочу, чтобы состояние B было первым, которое загружается.

Моя проблема заключается в том, что к тому моменту, когда я проверяю это условие, например, в app.run, состояние по умолчанию уже загружается и отображается в представлении и только затем переключается в состояние B.

Есть ли способ сдержать состояние загрузки и запустить его только после проверки состояния?

+0

не будет $ urlRouterProvider.otherwise (функция ' ($ injecto r, $ location) {...} 'решение для вас? Подробнее об этом [$ urlRouterProvider] (http://angular-ui.github.io/ui-router/site/#/api/ui.router.router.$urlRouterProvider). И если вам нужно также **. Run() ** phase ... отложенное выполнение может быть решением http: // stackoverflow.com/questions/30455792/start-angular-js-route-segment-or-ui-router-after-all-translations-are-loaded –

+0

Не могли бы вы использовать решение в $ routeProvider, а затем перенаправить на правильный маршрут – George

+0

@ RadimKöhler Я проверю это и отчитаю, спасибо. –

ответ

1

Существует a working example

Как обсуждалось в комментариях, мы можем использовать собственные, встроенные функции, приходя с UI-маршрутизатором. Один из них: $urlRouterProvider.deferIntercept(defer)

Отключает (или разрешает) откладывание перехвата изменения местоположения.

Если вы хотите настроить поведение синхронизации URL-адреса (например, если вы хотите отложить переход, но сохраните текущий URL-адрес), вызовите этот метод во время настройки. Затем во время выполнения вызовите $urlRouter.listen() после того, как вы настроили свой собственный обработчик событий $locationChangeSuccess.

I. шаг - выполнение СТОП

Таким образом, мы можем определить состояния в .config() фазы

.config(['$stateProvider', '$urlRouterProvider','$locationProvider', 
    function ($stateProvider, $urlRouterProvider,$locationProvider) { 

     // States 
     $stateProvider 
      ... 
      .state('parent', { 
       ... 
      }) 
      .state('parent.child', { 
       ... 
      }) 
      ; 

     ... 
     // here we say STOP 
     $urlRouterProvider.deferIntercept(); 
    } 
]) 

II. шаг - INIT, что необходимо в .run() - повторное включение исполнение

Это может быть какой-то наивный пример бега:

.run(['$urlRouter', '$timeout', '$state', 
    function($urlRouter, $timeout, $state) { 

    $timeout(function(){ 

     // here we turn all on again... 
     $urlRouter.sync(); 
     $urlRouter.listen(); 

     // there could be some decision, driven by $http load 
     // we just use some state as default target 
     $state.go("parent.child"); 
    }, 1000) 

}]); 

Se сделать ждать второй, а затем мы снова включить все выполнение и перенаправление на «parent.childd» ... но может быть любой другой, основанный на некотором решении сделано в .run() фазы

Проверить это here

+1

Спасибо большое! –

0

Воспользоваться resolve. если вы используете ngRoute

$routeProvider 
.when('/' ,{ 
    templateUrl: "templates/A.html", 
    resolve:{ 
     "check":function($location){ 
      if(x==4){ 
       $location.path('/B'); 
      } 
     } 
    } 
}) 
.when('/B' ,{ 
    templateUrl: "templates/B.html" 
}) 
.otherwise({redirectTo: '/'}); 
+0

Я пробовал идти таким образом, но условие зависит от результата async, поэтому он не работает. В любом случае, это показывает вид. –

+2

Должно быть, как минимум, указано, что 'ngRoute' и' UI-Router' - это не то же самое ... –

+0

@downvoter, Позаботьтесь, чтобы объяснить ваш downvote? – Zee

Смежные вопросы