【问题标题】:Durandal 2 / activate method called only once in child routeDurandal 2 / activate 方法在子路由中仅调用一次
【发布时间】:2014-12-10 08:20:59
【问题描述】:

在 Durandal 2.x 应用程序中,我有一个视图,每次用户导航到它时都需要获取新数据。此视图通过子路由器提供服务:

define(['plugins/router'], function(router) {
    var vm = {};

    vm.router = router.createChildRouter()
        .makeRelative({
            moduleId: 'viewmodels/cms',
            fromParent: true
        }).map([
            { route: ['inventory', ''], moduleId: 'inventory/overview', title: 'Inventory Management', nav: true }
        ]).buildNavigationModel();

    return vm;
});

我已将数据获取逻辑放在overview.js 中的activate 方法上

define(function(){
    var vm = {};

    vm.activate = function(){
       // fetch data here
    };

    return vm;
});

但是,activate 仅在我第一次导航到该视图时被调用,而对于主路由器上的视图,activate 每次都被调用。

我尝试在子路由器上设置cacheViews: false,但这并没有改变任何东西。

我还意识到,我的视图模型上的 binding 方法每次都会被调用,所以:

  1. 如何强制在每次用户导航到视图时调用 activate
  2. 当我总是希望刷新数据获取逻辑时,是否有更好的挂钩来放置它?
  3. 或者,将我的激活逻辑放在binding 方法上是否存在固有问题?

【问题讨论】:

  • 您是否尝试过将视图模型作为函数而不是单例返回?
  • 为什么我需要为子路由中的视图而不是主路由中的视图执行此操作?没有太多的直观意义......
  • 您是否在主路由器中缓存视图?
  • 不。我尝试使用cacheViews,在主路由器和子路由器上将其设置为truefalse,但没有任何区别
  • 您是否尝试在您的子路由器组合绑定上设置alwaysTriggerAttach: true

标签: durandal durandal-2.0


【解决方案1】:

您应该使用附加的挂钩。 每次将视图附加到 dom 时都会调用它。

查看有关 Hooking Lifecycle 的 Durandal 文档,这应该可以让您了解可用的钩子以及它们在做什么。

编辑: 抱歉,也许“应该”有点为时过早,这实际上取决于您的用例。绑定和附加都应该完成它只取决于它们何时完成的工作。绑定会在 DOM 被应用和附加之后挂钩。因此,这取决于您是否希望您的用户在加载所有内容之前看到一个白页,或者您是否希望显示一些内容,然后在附加的 Promise 解决时填充数据驱动的部分。所以实际上这更像是一个 UI 决定。

至于您的第三个问题,加载数据实际上并不是激活逻辑,因为您可能会在构建 UI 后重新获取数据。因此,它更多是数据层的一个方面-> 业务逻辑,但这是一个非常哲学的问题:)。绑定与在 Knockout 绑定开始之前提取数据完全相关,因此如果您需要更令人窒息的用户体验,我认为将该逻辑放入绑定或分别附加是没有问题的。

【讨论】:

  • 您能否详细说明为什么attached 挂钩会比binding 挂钩更好?我熟悉这些文档,但我觉得他们没有回答我的问题。
  • 实际上,根据我从文档中收集到的信息,attached 钩子在我获取数据的生命周期后期出现,因为那时 applyBindings 已经被调用跨度>
  • 我已经更新了我的回复。对不起,也许你“应该”使用的有点过早
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2013-12-17
  • 2013-05-16
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多