【问题标题】:Can I implement a ViewLocator with KnockoutJS?我可以用 KnockoutJS 实现 ViewLocator 吗?
【发布时间】:2016-08-30 11:03:56
【问题描述】:

KnockoutJS 是否提供某种方式来实现 ViewLocator?

ViewLocator 类似于组件绑定,但不同之处在于它绑定到 ViewModel 对象和 自动找出正确的 View 来实例化和绑定。

比如我想写这个

<div data-bind="component: $data"></div>

<div data-bind="component: $data.DetailsViewModel"></div>

<div data-bind="viewLocator: $data.DetailsViewModel"></div>

我希望它使用命名约定找到并创建 DetailsView.html 并将其绑定到数据绑定的 DetailsViewModel observable。

请注意,我不想指定组件名称,也不想手动注册组件

这可能吗?

【问题讨论】:

  • “查找并创建 DetailsView.html”是什么意思?它应该在哪里找到它?
  • 使用一些约定定位模板
  • 这是可能的,只要投入适当的努力。 IMO这个问题需要太多的努力才能适合SO。在谷歌搜索“viewLocator”时,我怀疑您来自 Durandal 背景,因此建议您首先了解他们是如何实现它的。

标签: mvvm knockout.js


【解决方案1】:

您可以通过自定义组件加载器来实现它。

http://knockoutjs.com/documentation/component-loaders.html

并通过自定义 createViewModel 使用的参数注入完整视图模型以将其公开给视图。

<div data-bind='component: {
    name: "DetailsView",
    params: { injectModel: DetailsViewModel}
}'></div>

【讨论】:

  • 我不想明确指定名称。我希望它通过使用命名约定的代码来实现
  • 我也不想注册任何东西。我的命名约定能够自动查找组件。
  • 写“DatailsView”w.r.t 有什么区别?详细视图模型?您仍在修复组件的“名称”,第一种方式明确表示,第二种方式您想要一种从变量名称中删除“模型”的方法。没有实际区别。
  • 您不必注册它们。使用自定义加载程序,您可以避免它。默认要求您注册它们,您可以按照约定找到模板。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2016-08-26
  • 2017-12-17
  • 2010-09-21
相关资源
最近更新 更多