0

只是想知道是否有人知道使用 Durandal 处理或重新初始化视图模型无效的好/简单方法?

我有一个注册表单,在用户完成表单并成功注册后,我可以手动“重新初始化”,但我更愿意将其丢弃,以便 Durandal 在该特定路线时创建一个新的注册视图/视图模型再次访问。

4

4 回答 4

0

如果您使用路由,只需将用户重定向到基于实例的模块(返回构造函数的模块)。用户很可能会点击或触摸表示他已完成注册表单的按钮。那将是重定向操作。

如果您使用组合,您仍然会创建一个基于实例的模块。然后,一旦用户表示他已完成注册表单,您将使用动态组合将其交换。

动态组合是 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。

于 2014-04-12T01:30:51.513 回答
0

Durandal 模块构造函数信息的更新链接:模块值

您可以拆分差异:

var cache;
var ctor = function () {
    if (cache) return cache;
    // init logic
    cache = this;
}

只需将 if(cache) 检查替换为您喜欢的任何“我是否需要新事物”逻辑。

于 2014-04-11T19:35:44.390 回答
0

如果您的 viewmodel 模块返回一个函数而不是一个对象,它将每次创建一个新的,而不是重用“单例”对象。请参阅创建模块的模块值部分。

于 2013-06-05T11:02:12.763 回答
0

使用 Durandal 2.0,您可以在组合生命周期内使用 deactivate 回调。这是一些文档http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks

于 2014-05-07T10:57:19.707 回答