首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Knockout.js可组合组件?

Knockout.js可组合组件?
EN

Stack Overflow用户
提问于 2015-04-13 12:30:52
回答 2查看 222关注 0票数 0

我正在考虑使用Knockout.js来创建可重用的组件。但是,通过读取文档,我不知道如何实现一个组件,该组件可以在其中容纳其他组件(可能与每次使用不同)。

例如,我想实现一个侧菜单视图组件,它包含一个带有菜单按钮的标题栏、一个菜单面板和一个内容面板。菜单和内容面板的内容不应预先定义。例如,在一个用例中,我会在菜单面板中放置一个列表视图组件,在另一个用例中,我可以在菜单面板中放置一个复选框列表。

正如我从文档中了解到的,在Knockout.js中,必须完全定义组件的模板,并且不提供以后可以插入其他组件的位置。还是我错了?能办到吗?谢谢!

更新:

我想要创建一个组件,它可以用作:

代码语言:javascript
复制
<side-menu-view>
  <menu>
    <!-- I can put anything here -->
  </menu>
  <content>
    <!-- I can put anything here -->
  </content>
</side-menu-view>

我知道可以通过$componentTemplateNodes访问组件的子节点,但是我希望能够分别获取<menu><content>的内容,并将其放在组件布局的适当位置。

更新2:

示例使用:

代码语言:javascript
复制
<side-menu-view>
  <menu>
    This is a menu!
  </menu>
  <content>
    This is content!
  </content>
</side-menu-view>

或者像这样:

代码语言:javascript
复制
<side-menu-view>
  <menu>
    <ul>
      <li><a href="#">1</a></li>
      <li><a href="#">2</a></li>
      <li><a href="#">3</a></li>
    </ul>
  </menu>
  <content>
    <h1>Title</h1>
    <p>Some text</p>
  </content>
</side-menu-view>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-13 13:08:59

如果您使用的是自定义html元素语法,那么您必须在编写html时了解这些组件,如下所示:

代码语言:javascript
复制
<menu-panel>
    <list params="..."/>
</menu-panel>

但是,您有一个组件绑定,它允许您在运行时选择组件:

代码语言:javascript
复制
<menu-panel>
    <div data-bind="component: {
        name: yourDynamicComponentName,
        params: { ... },
    }"/>
</menu-panel>

当然,请注意,yourDynamicComponentName仍然必须注册,这样淘汰赛才知道在哪里可以找到它。

RE: Update 2(只关注menu控件,因为它显然与content控件相似):

所以您只需定义两个组件,一个称为menu-list,另一个称为menu-static

代码语言:javascript
复制
// html for a component called "menu-list"
<ul>
  <li><a href="#">1</a></li>
  <li><a href="#">2</a></li>
  <li><a href="#">3</a></li>
</ul>

// html for a component called "menu-static"
This is a menu!

viewModel for side-menu-view中,您可以有一个名为menuType的属性,您可以在html中为side-menu-view使用它,如下所示:

代码语言:javascript
复制
// html for "side-menu-view"
<div data-bind="component: { name: menuType }"/>

因此,当您想在菜单类型之间切换时,可以设置menuType('menu-static')menuType('menu-list')

票数 1
EN

Stack Overflow用户

发布于 2015-04-13 12:41:56

一个淘汰赛的模型可以是“预定义的”为一般用途,然后扩展为特定的用途。这意味着:

  1. 按照通常的做法创建一个对象/模型
  2. 创建具有扩展属性的对象/模型
  3. 将这两个模型与jQuery的$.extend混合使用

示例:

代码语言:javascript
复制
var mainModel = function () {
    this.blablabla = ko.observable('blablabla');
}

var extendedModel = function () {
    this.sup = ko.observable('sup');
}

var myModelInstance = $.extend({}, new mainModel(), new extendedModel());

console.log(myModelInstance.blablabla(), myModelInstance.sup()); // "blablabla", "sup"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29605401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档