Как установить активационную стратегию по умолчанию в aurelia
Аурелия обычно игнорирует любые изменения в строке запроса.
Можно установить activationStrategy
в invoke-lifecycle
в ВМ, поэтому при изменении строки запроса он будет перезапускать все жизненные циклы в ВМ.
Чтобы предотвратить засорение моего кода (размещение его на каждой виртуальной машине), я хочу установить значение по умолчанию activationStrategy
в invoke-lifecycle
,
В интерфейсе объясняется, что это возможно, но как это установить? https://github.com/aurelia/router/blob/master/src/interfaces.js
3 ответа
На ViewModel
(Я тоже сначала неправильно понял ваш вопрос, но я оставлю это для полноты)
Поместите метод determineActivationStrategy()
в ViewModel и оттуда вы можете вернуть имя или тип стратегии активации, которую вы хотите использовать. Пример:
determineActivationStrategy() {
return "invoke-lifecycle";
}
Струны "invoke-lifecycle"
или же "replace"
буду работать. Вы также можете использовать печатную версию, импортировав enum activationStrategy
и отступая activationStrategy.replace
/ activationStrategy.invokeLifecycle
, Они работают одинаково.
В RouteConfig
Или, как сказал Мартон (который дал этот ответ раньше, чем я), вы можете поместить его непосредственно в конфигурацию маршрута как свойство activationStrategy
,
Этот подход лучше подходит, если стратегия не зависит от какого-либо конкретного состояния вашей ViewModel, и вы не хотите засорять вашу модель представления этим материалом.
жизненный цикл invoke против замены
В своем вопросе вы говорите, что хотите
перезапустить все жизненные циклы в ВМ
Обратите внимание, что invoke-lifecycle
повторно использует существующую ViewModel и запускает только жизненный цикл активации маршрутизатора, который выглядит следующим образом:
canDeactivate()
deactivate()
canActivate(params, routeConfig, navigationInstruction)
activate(params, routeConfig, navigationInstruction)
В то время как replace
отбросит существующую ViewModel и снова вызовет весь жизненный цикл ViewModel поверх жизненного цикла активации маршрутизатора:
canDeactivate()
deactivate()
detached()
unbind()
- (новый экземпляр):
constructor()
canActivate(params, routeConfig, navigationInstruction)
activate(params, routeConfig, navigationInstruction)
created(owningView, thisView)
bind(bindingContext, overrideContext)
attached()
Так что если вы действительно хотите выполнить все шаги жизненного цикла ViewModel, вам нужно будет использовать replace
,
activationStrategy
является собственностью RouterConfig
, который представляет объект конфигурации маршрута, используемый config.map()
, Я думаю, что вам нужно установить его для каждого определения маршрута.
Пример:
configureRouter(config, router) {
...
config.map([
{
route: ['', 'home'],
name: 'home',
moduleId: 'home/index',
activationStrategy: 'invoke-lifecycle'
}
]);
...
}
(Изменить причину: я допустил ужасную ошибку, сначала неправильно прочитав ваш вопрос, извините:))
Ты можешь использовать config.options.compareQueryParams = true
,