使用Durandal模式对话框显示小部件

时间:2013-03-28 17:38:14

标签: single-page-application durandal

我最近开始使用Durandal库来开发我正在开发的SPA ......对作者来说,这是一个很棒的库。

我喜欢小部件的概念,而不是使用无状态屏幕的视图,但我无法在模态对话框中显示小部件,而无需将其附加到视图。有谁知道怎么做?

详细说明,有一个 widget.create 函数,它允许在JS中创建一个小部件,但需要附加DOM元素。我更喜欢做的是创建一个小部件,而不将其附加到DOM,然后调用类似:

app.showModal(theWidget);

作为替代方案,我知道我可以创建一个映射到可交换小部件的“对话框”视图,然后将该视图用于对话框,例如该视图将具有:

<div data-bind="widget: {kind:widgetId}">/div>

......然后:

app.showModal('viewmodels/dialog');

其中'viewmodels / dialog.js'是 “对话框”视图的视图模型

参考文献:

1 个答案:

答案 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

希望这有帮助。