Как установить активационную стратегию по умолчанию в 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 и запускает только жизненный цикл активации маршрутизатора, который выглядит следующим образом:

  1. canDeactivate()
  2. deactivate()
  3. canActivate(params, routeConfig, navigationInstruction)
  4. activate(params, routeConfig, navigationInstruction)

В то время как replace отбросит существующую ViewModel и снова вызовет весь жизненный цикл ViewModel поверх жизненного цикла активации маршрутизатора:

  1. canDeactivate()
  2. deactivate()
  3. detached()
  4. unbind()
  5. (новый экземпляр): constructor()
  6. canActivate(params, routeConfig, navigationInstruction)
  7. activate(params, routeConfig, navigationInstruction)
  8. created(owningView, thisView)
  9. bind(bindingContext, overrideContext)
  10. 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,

Changelog entry

Другие вопросы по тегам