具有多个视图的 Durandal 小部件

2024-03-29

我正在使用 Durandal 开发 SPA,并且我创建了一个用于显示特定页面组件的小部件。继杜兰达尔文档 http://durandaljs.com/documentation/Creating-A-Widget/,小部件位于app/widgets/my-widget并且由组成viewmodel.js and view.html.

现在,我想向同一个小部件添加一个不同的视图 - 实际上,有一个“基本”视图和一个“高级”视图,并在 ViewModel 中带有一个将使用的标志。

我不想创建两个不同的小部件,因为 ViewModel 完全相同,并且我想避免不必要的代码重复。我也不想将两个版本的视图放入view.html并且只根据 ViewModel 中的标志显示其中一个,因为随着稍后将功能添加到小部件中,这将很快成为维护的一场噩梦。

我认为一个答案是做某种查看构图 http://durandaljs.com/documentation/Using-Composition/,其中要组合的视图的名称是根据标志从 ViewModel 返回的,但我不太确定该怎么做。

有人有办法做到这一点吗?我应该有不同的方法来解决这个问题吗?


UPDATE这是我想做的一个例子。有一个小部件workitem用于显示“工作项”。在 ViewModel 中,工作项有一个属性status它可以取值ready, in-progress, complete, or invalid。根据工作项的状态,需要显示的有关它的信息(及其视图)完全不同。我想做的是设置这样的东西:

-widgets
|
|-workitem
|  |-viewmodel.js
|  |-view-ready.html
|  |-view-in-progress.html
|  |-view-complete.html
|  |-view-invalid.html

...然后根据 ViewModel 中的属性自动选择这些视图之一。


我们对多视图小部件采取的方法是简单地使用if or the visible绑定,并将其绑定到视图模型上保存视图类型(例如“紧凑”、“扩展”、“分组”等)的可观察对象。

对于我们的日期选择器小部件,我们的高级视图是这样的(仅显示其中两个视图):

</div>
    <div data-bind="visible: viewMode() === 'months'">
        <div data-bind="compose: {model: 'widgets/datepicker/datepickerMonths', view: 'widgets/datepicker/datepickerMonths', activate: true, activationData: messageChannel }">    </div>
    </div>
    <div data-bind="visible: viewMode() === 'years'">
        <div data-bind="compose: {model: 'widgets/datepicker/datepickerYears', view: 'widgets/datepicker/datepickerYears', activate: true, activationData: messageChannel }">    </div>
    </div>
</div>

The viewModeobservable 允许我们在视图之间切换。

我们使用visible在这种情况下具有约束力有两个原因:

  1. 性能:布局仍然加载在 DOM 中,只是隐藏;
  2. jQuery clickoutside 插件被混淆了if绑定(if可以这么说,绑定将 DOM 从用户的鼠标指针下方踢出,并导致 clickoutside 插件相信用户已单击了外部)。

通过上述方法,您的小部件的单个 view.html 文件可以引用多个动态可组合视图。

我提供了一个指向我的日期选择器的公共 SkyDrive(现在的 OneDrive)文件夹的链接,该文件夹完全是为了利用 Durandal 的组合和小部件系统以及 KnockoutJS 而编写的:当我从一个视图切换到另一个视图时日期选择器的视频 http://1drv.ms/1dvLRSO。视图的切换使用上述技术进行。

日期选择器的特点:

  • datepicker是一个多视图小部件
  • 它组成了一个输入字段和我们的弹出窗口小部件(换句话说,小部件内的小部件)
  • 高级视图动态地组成三个不同的视图,并随着用户交互而在它们之间切换
  • 它依赖 postal.js 作为客户端消息总线,用于在视图之间路由选择、与父视图协调以及更新输入控件(如果您愿意,可以使用 Durandal 的内置 pub/sub)
  • 它使用 jwerty.js 进行键盘管理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多个视图的 Durandal 小部件 的相关文章

随机推荐

  • Swift 中设置和读取 Bool 是原子操作吗?

    正如标题所示 很简单 基本上 在这个例子中 我们是否可以获得无效状态 var myBool false Thread 1 while true if randomEvent myBool true Thread 2 while true i
  • 服务器安全和通过 Rest 访问 OrientDB

    我猜这是一个令人尴尬的初学者问题 无论如何 在 OrientDB 文档的 服务器安全 下 我们发现 虽然 OrientDB Server 可以充当常规 Web 服务器 但不建议您将其直接公开到 Internet 或公共网络 相反 始终将 O
  • 在 Java 32 位和 Java 64 位之间切换

    我刚刚发现 如果我使用 64 位 JDK Apache Tomcat 无法作为 Windows 服务运行 因此我在 Windows 上另外安装了 Java 32 位 问题是当我使用 java version 检查 java 版本时 它仍然显
  • 从 wtforms 和flask-sqlalchemy 中的数据库查询中获取选择

    我正在使用 Flask SQLAlchemy 和 WTForms 开发一个 Web 应用程序 我想得到我的选择选择字段通过我的数据库查询 有更多细节 my query my table query with entities My Enti
  • 日志文件的合适大小(以字节为单位)是多少?

    我正在使用蟒蛇logging http docs python org library logging html simple examples模块旋转文件处理器 http docs python org library logging h
  • BasicHttpBinding 端点配置中的 bindingConfiguration 属性负责什么?

    因此 我正在为 WCF 服务配置端点 我对整个服务几乎没有经验 但一直在使用它们的项目中 我大致了解端点中除一个属性之外的每个属性的作用 绑定配置 这是我的代码的模糊版本 实际信息是专有的
  • vuejs - 计算不能与 props 一起使用

    我正在使用 props 来更新子组件中的网站内容 这基本上是这样工作的
  • 在 Firestore 中安全保存数据

    Firestore 文档shows https firebase google com docs firestore security rules query examples https firebase google com docs
  • Groovy:从文件中读取一系列行

    我有一个文本文件 其中包含大约 2 000 000 行的大量数据 使用以下代码片段浏览文件很容易 但这不是我需要的 def f new File input txt f eachLine Some code here 我只需要从文件中读取特
  • 函数指针作为参数

    我尝试调用一个不带参数作为函数指针传递的函数 但我无法使其工作 void disconnectFunc void D setDisconnectFunc void func disconnectFunc func void D discon
  • TPL 是否可以在多个线程上运行任务?

    欢迎特定于 Mono Xamarin 的答案 我正在使用 Task Run 运行 System Threading Tasks TPL 是否会在任务执行的生命周期内将创建的任务分配给单个线程 或者创建的任务是否有可能在运行时被抢占 然后再次
  • Plotly - 如何绘制圆柱体?

    I have a function plotting the cylinder using matplotlib 我想知道如何使用情节来做同样的事情 下面是我绘制圆柱体的 matplotlib 函数 function to plot the
  • 更新核心数据存储位置以支持应用程序组

    我在 App Store 中已有一个使用核心数据来保存数据的应用程序 现在 当 iOS 8 即将发布时 我想为其添加一个小部件 因此我必须使用应用程序组在二进制文件之间共享数据 但有一个问题 我需要更改商店位置以支持所有现有用户的应用程序组
  • 使用 Python 将 HTML 转为 RTF 字符串

    我正在寻找一种将 HTML 文本转换为 RTF 字符串的方法 有没有任何图书馆可以完成这项工作 我在项目中动态获取 html 内容 并需要将其以 RTF 格式呈现 我正在使用 HTML 解析器将 HTML 文本转换为普通字符串 然后尝试使用
  • Boost.Python - 向量到 Numpy 数组

    我有以下课程 class PyWav public static inline boost python object sdVecToNumpyArray std vector
  • 如何模拟 DefaultCellEditor 的“onStartCellEditing”

    CellEditorListener 有 editingStopped 和 editingCancelled 但是 我如何实现在单元格编辑会话开始时需要运行的一段代码呢 一个典型的示例可能是 当您开始编辑时 您希望 JTextField 编
  • 使用 SQL Server 2016 批量导入 Unicode

    由于我们已经迁移到 SQL Server 2016 我们现在尝试使用非 XML 格式文件和 UTF 8 编码数据文件 使用换行符 Unix LF 通过 BULK IMPORT 将 Unicode 字符导入表中 格式文件指定主机文件数据长度
  • Javafx 删除应用程序启动时的快速白屏

    使用 javafx 7 更新 60 操作系统 Windows 7 我刚刚从那里获取了 helloworldhttp docs oracle com javafx 2 get started hello world htm http docs
  • 如何在客户端使用 Java 读取 gRPC 中的元数据

    我正在使用 Java 和 Protoc 3 0 编译器 我的 proto 文件如下所述 https github com openconfig public blob master release models rpc openconfig
  • 具有多个视图的 Durandal 小部件

    我正在使用 Durandal 开发 SPA 并且我创建了一个用于显示特定页面组件的小部件 继杜兰达尔文档 http durandaljs com documentation Creating A Widget 小部件位于app widget