Durandal + Typescript:在每个路线激活时构建的Viewmodel

时间:2014-05-13 15:15:52

标签: knockout.js typescript durandal durandal-2.0

我正在使用Durandal和Typescript。

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

此外,viewmodel仍然处于活动状态并在停用后在内存中运行,因为我有一些即使用户已离开viewmodel也运行代码的computedObservable。

如何避免viewmodel上的多个构造 - 或者 - 如何在停用后正确处理viewmodel?

2 个答案:

答案 0 :(得分:0)

如果您导出一个类,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;

答案 1 :(得分:0)

如果您想将该类保留在同一个文件中,您也可以设置一个接口来代替处理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;