我最近开始使用Durandal库来开发我正在开发的SPA ......对作者来说,这是一个很棒的库。
我喜欢小部件的概念,而不是使用无状态屏幕的视图,但我无法在模态对话框中显示小部件,而无需将其附加到视图。有谁知道怎么做?
详细说明,有一个 widget.create 函数,它允许在JS中创建一个小部件,但需要附加DOM元素。我更喜欢做的是创建一个小部件,而不将其附加到DOM,然后调用类似:
app.showModal(theWidget);
作为替代方案,我知道我可以创建一个映射到可交换小部件的“对话框”视图,然后将该视图用于对话框,例如该视图将具有:
<div data-bind="widget: {kind:widgetId}">/div>
......然后:
app.showModal('viewmodels/dialog');
其中'viewmodels / dialog.js'是 “对话框”视图的视图模型 。
参考文献:
答案 0 :(得分:2)
小部件是网页上可重复使用的控件,因此这就是他们需要DOM元素的原因。我不确定我是否完全理解你要做的事情,但你可以定义一个返回其构造函数而不是单个对象的视图。
这是一个返回单身的视图:
define([], function() {
var singleton = {
title: "I'm Mr. Singleton"
};
return singleton;
});
这是相同的视图,但返回其构造函数:
define([], function() {
var notSingleton = function () {
this.title = "I'm NOT Mr. Singleton"
};
return notSingleton;
});
然后,您可以在另一个视图模型或模块中使用其中任何一个:
define(['viewmodels/singleton', 'viewmodels/notSingleton'],
function(singleton, NotSingleton) {
...
app.showModal(singelton);
app.showModal(new NotSingleton());
...
});
在后一种情况下,您可以跨多个其他视图创建同一视图模型的多个对话框,但每个视图都是自己的具有自己属性的实例。如果要在该视图模型类型的所有实例之间共享数据和/或行为,可以将它们添加到viewmodel的prototype
。
希望这有帮助。