2015-09-13 3 views
4

Согласно documentation, вы можете использовать пользовательские данные и слушать stateChange s, чтобы предотвратить доступ к состоянию, основанному на некоторых условиях. Это работает без проблем, но мой вариант использования - когда я вхожу в вложенное состояние, я хочу, чтобы все правила состояний потомков были соблюдены.ui-router вложенное состояние и промежуточный защитник

Другими словами, если я начинаю с green состояния, и я хочу в конечном итоге находиться в blue состоянии, я хочу, чтобы правило login получило оценку. В настоящее время применяется только правило color. Есть какой-либо способ сделать это?

Я понимаю, что данные перезаписываются в дочернем состоянии, и именно по этой причине я вижу только журнал color. Но каков способ расширения data и не перезаписывать его?

example

вот код:

var example = angular.module("example", ['ui.router']); 

example.config(function ($stateProvider, $urlRouterProvider) { 
    $stateProvider 
     .state("parent", { 
      url: "/parent", 
      templateUrl: "templates/parent.html", 
      data: { 
       rule: function() { 
        console.log("login rule checked"); 
        return true; 
       } 
      } 
     }) 
     .state("parent.child", { 
      url: "/child", 
      templateUrl: "templates/child.html", 
      data: { 
       rule: function() { 
        console.log("color rule checked"); 
        return true; 
       } 
      } 
     }); 
}); 


example.run(function ($rootScope, $state) { 
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
     if (!toState.data || !angular.isFunction(toState.data.rule)) return; 
     var result = toState.data.rule(); 
     if (result) { 
      event.preventDefault(); 
      $state.go(toState, result.params, {notify: false}); 
     } else { 
      event.preventDefault(); 
     } 
    }) 

}); 

ответ

0

Я не уверен, если это именно то, что вы хотите, но сделать это:

$state.go(toState, result.params, {notify: false, reload:true}); 

обеспечит, чтобы весь состояние перезагружается, включая все родительские состояния. Это не совсем то, что вы хотите, так как он может перезагрузить больше, чем вы хотите, если состояние R не является вершиной дерева. Однако это должно работать в примере, который вы показываете.

Для получения дополнительной информации см. ui-router API.

+0

По-прежнему не регистрируется правило входа в систему. Я что-то упускаю? – norbertpy

+0

Упс. Я не очень внимательно прочитал ваш вопрос. Дай мне попробовать снова... –

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