Aurelia通常会忽略查询字符串中的任何更改。
可以在VM中将invoke-lifecycle
设置为activationStrategy
,以便在查询字符串更改时重新运行VM中的所有生命周期。
为防止乱丢我的代码(将其放在每个VM中),我想将默认invoke-lifecycle
设置为$warehouses = WarehousePivotCategory::with(['warehouse' => function($q) use ($title) {
$q->where('title', 'like', '%' . $title . '%')->get(); },'WarehouseCategory'])->get();
。
在界面中,它解释了 可能,但如何设置呢? https://github.com/aurelia/router/blob/master/src/interfaces.js
答案 0 :(得分:26)
(我最初也误解了你的问题,但我为了完整而把它留下来了)
在ViewModel上放置方法determineActivationStrategy()
,然后您可以返回要使用的激活策略的名称或类型。例如:
determineActivationStrategy() {
return "invoke-lifecycle";
}
字符串"invoke-lifecycle"
或"replace"
将有效。您还可以通过导入枚举activationStrategy
并退回activationStrategy.replace
/ activationStrategy.invokeLifecycle
来使用键入的版本。他们的工作方式相同。
或者,正如Marton所说(在我做之前给出了这个答案),你可以直接把它作为属性activationStrategy
放在路由配置中。
如果策略不依赖于ViewModel的任何特定状态,并且您不希望使用这些内容丢弃视图模型,则此方法更适合。
在你的问题中,你说你想要
重新运行VM中的所有生命周期
请注意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
。
答案 1 :(得分:8)
activationStrategy
是RouterConfig
的属性,表示config.map()
使用的路由配置对象。我认为你需要在每个路由定义上设置它。
示例:
configureRouter(config, router) {
...
config.map([
{
route: ['', 'home'],
name: 'home',
moduleId: 'home/index',
activationStrategy: 'invoke-lifecycle'
}
]);
...
}
(编辑原因:我最初误读了你的问题犯了一个可怕的错误,对不起:))
答案 2 :(得分:0)
您可以使用config.options.compareQueryParams = true
。