只是想知道是否有人知道使用 Durandal 处理或重新初始化视图模型无效的好/简单方法?
我有一个注册表单,在用户完成表单并成功注册后,我可以手动“重新初始化”,但我更愿意将其丢弃,以便 Durandal 在该特定路线时创建一个新的注册视图/视图模型再次访问。
如果您使用路由,只需将用户重定向到基于实例的模块(返回构造函数的模块)。用户很可能会点击或触摸表示他已完成注册表单的按钮。那将是重定向操作。
如果您使用组合,您仍然会创建一个基于实例的模块。然后,一旦用户表示他已完成注册表单,您将使用动态组合将其交换。
动态组合是 Durandal 组合上的视图和/或模型属性本身是可观察的,在 viewModel 中引用如下内容:
this.currentView = ko.observable('');
this.currentModel = ko.observable('');
然后,在您的 HTML 中:
<div>
<div data-bind="compose: {view: currentView(), model: currentModel())"></div>
</div>
当用户单击“完成”或类似的效果时,viewModel 上的函数可能如下所示:
ctor.prototype.done = function () {
this.setCurrentView('viewmodels/registrationForm.html');
this.setCurrentModel('viewmodels/registrationForm.js');
}
ctor.prototype.setCurrentView = function (view) {
this.currentView(view);
}
ctor.prototype.setCurrentModel = function (model) {
this.currentModel(model);
}
上述任何一种方法都只会在需要时创建registrationForm。
Durandal 模块构造函数信息的更新链接:模块值
您可以拆分差异:
var cache;
var ctor = function () {
if (cache) return cache;
// init logic
cache = this;
}
只需将 if(cache) 检查替换为您喜欢的任何“我是否需要新事物”逻辑。
如果您的 viewmodel 模块返回一个函数而不是一个对象,它将每次创建一个新的,而不是重用“单例”对象。请参阅创建模块的模块值部分。
使用 Durandal 2.0,您可以在组合生命周期内使用 deactivate 回调。这是一些文档http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks