【问题标题】:Durandal + Typescript: Viewmodel constructed on every route activationDurandal + Typescript:在每次路由激活时构建的 Viewmodel
【发布时间】:2014-07-01 08:38:58
【问题描述】:

我正在使用带有 Typescript 的 Durandal。

每次访问该路线时都会调用我的 Viewmodel 构造函数。这似乎是一种浪费。 视图模型中的状态不应该在不同的激活之间保持,然后当再次需要视图模型时,只会调用该实例上的 activate() 吗?

此外,视图模型在停用后仍然存在并在内存中运行,因为即使用户离开了视图模型,我也有一些运行代码的 computedObservables。

如何避免视图模型上的多重构造 - 或者 - 在停用后如何正确处理视图模型?

【问题讨论】:

  • 您的视图模型是返回自身的实例还是构造函数?
  • 类 vm { ... };出口 = vm;

标签: knockout.js typescript durandal durandal-2.0


【解决方案1】:

如果您导出一个类,Durandal 默认在每次新激活时构建一个新类。这是故意的,因为它允许您在页面的每个视图上“重新开始”。 (如果您想到 RESTful 模型并且导航到新 URL 通常应该给出“新鲜”状态,这是有道理的......)

您可以通过在您的类中的 deactivate() 函数中处理您的计算来解决“挂起”计算问题。 (Durandal lifecycle events) 您也可以使用 Knockout 3.2 中的新 pureComputed

如果您仍希望使用单例视图模型,您可以在 TypeScript 文件中导出单例:

// Move this to a new file to simplify TS export restriction problems
export class MyVm { ... }

// In the module that durandal imports for its viewmodel
import myvmmodule = require('myvmmodule');
var vm = new myvmmodule.MyVm();
export = vm;

【讨论】:

    【解决方案2】:

    如果您想将类保留在同一个文件中,您还可以设置一个接口来处理 TS 导出限制

    // create interface in a new file
    export interface IMyVM {...}
    
    // Keep all this code in one file
    import i = require('iMyVMModule');
    class MyVm: i.IMyVM { ... }
    var vm = new myvmmodule.MyVm();
    export = vm;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      相关资源
      最近更新 更多