Я создаю приложение, в котором я хочу переключить свойство в службе, как только пользователь войдет и покинет маршрут. Для этого мне нужно знать о имени состояния в onEnter
и onExit
. Это относительно легко для onExit
hook, так как я могу просто ввести службу $state
и прочитать имя текущего состояния. Но поскольку текущее состояние еще не установлено, когда вызван крюк onEnter
, нет способа узнать, к какому состоянию мы переходим.
Мне все еще нужно иметь прекрасный контроль над другими частями штата, поэтому я бы предпочел не иметь никаких циклов. Я ищу способ передать функцию onEnter
в состояние, сохраняя при этом имя состояния внутри самой функции.
Вот код, который я написал:
function onEnter($state, Steps) {
var stateName = $state.current.name; // Not possible. The current state has not been set yet!
var step = Steps.getByStateName(stateName);
step.activate();
}
function onExit($state, Steps) {
var stateName = $state.current.name; // No problem. We know about the state.
var step = Steps.getByStateName(stateName);
step.deactivate();
}
$stateProvider
.state('step1', {
url: '/step1',
templateUrl: 'templates/step1.html',
controller: 'StepOneController',
onEnter: onEnter,
onExit: onExit
});
Мое решение, которое я использую сейчас, это использовать factory для создания контекста для функции onEnter
, переданной в состояние. Это далеко не идеально, потому что мне все равно нужно передать ему название состояния.
Вот пример упомянутого обходного пути:
function onEnterFactory(stateName) {
return function onEnter(Steps) {
var step = Steps.getByStateName(stateName);
step.activate();
}
}
$stateProvider
.state('step1', {
url: '/step1',
templateUrl: 'templates/step1.html',
controller: 'StepOneController',
onEnter: onEnterFactory('step1')
});