【问题标题】:How to set default activationStrategy in aurelia如何在 aurelia 中设置默认激活策略
【发布时间】:2018-10-20 01:24:48
【问题描述】:

Aurelia 通常会忽略查询字符串中的任何更改。

可以在 VM 中将 activationStrategy 设置为 invoke-lifecycle,以便在查询字符串更改时重新运行 VM 中的所有生命周期。

为了防止乱扔我的代码(将它放在每个 VM 中),我想将默认的 activationStrategy 设置为 invoke-lifecycle

界面中说明可以的,但是如何设置呢? https://github.com/aurelia/router/blob/master/src/interfaces.js

【问题讨论】:

    标签: aurelia


    【解决方案1】:

    在视图模型上

    (起初我也误读了您的问题,但为了完整起见,我将其保留)

    在 ViewModel 上放置一个方法 determineActivationStrategy(),然后您可以从那里返回您希望使用的激活策略的名称或类型。示例:

    determineActivationStrategy() {
        return "invoke-lifecycle";
    }
    

    字符串"invoke-lifecycle""replace" 将起作用。您还可以通过导入枚举activationStrategy 并返回activationStrategy.replace / activationStrategy.invokeLifecycle 来使用类型化版本。它们的工作方式相同。

    在路由配置中

    或者,正如 Marton 所说(他在我之前给出了这个答案),您可以将其作为属性 activationStrategy 直接放在路由配置中。

    如果策略不依赖于 ViewModel 的任何特定状态并且您不希望在视图模型中乱扔这些东西,则此方法更适合。

    调用生命周期与替换

    在你的问题中你说你想要

    重新运行虚拟机中的所有生命周期

    注意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

    【讨论】:

    • 使用“determineActivationStrategy”也是我的第一个想法。然后我意识到 Vijay 想要避免将它放入每个 VM 中。您的答案有更多细节,所以+1! :)
    • 有趣的是,我其实一开始也误读了他的问题,以为他想把它放在 ViewModel 上!只是现在你提到它并且我重新阅读它,我发现了这一点。所以你的答案在我之前是正确的。也赞成:p
    • 我与 aurelia 开发人员交谈过,他也说了同样的话。但是,将其放在路由配置中不起作用。我会为它提出一个问题,谢谢:)
    【解决方案2】:

    activationStrategyRouterConfig的一个属性,代表config.map()使用的路由配置对象。我认为您需要在每个路由定义上进行设置。

    例子:

    configureRouter(config, router) {
      ...
      config.map([
        { 
          route: ['', 'home'],       
          name: 'home',       
          moduleId: 'home/index', 
          activationStrategy: 'invoke-lifecycle'
        }
      ]);
      ...
    }
    

    (编辑原因:我一开始误读了你的问题,犯了一个严重的错误,对不起:))

    【讨论】:

    • 这似乎不适用于 Aurelia v1.0.0-rc.1.0.0。
    【解决方案3】:

    您可以使用config.options.compareQueryParams = true

    Changelog entry

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-03
      • 2019-03-01
      • 2019-08-25
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      相关资源
      最近更新 更多