Nat*_*end 5 javascript web-component knockout.js knockout-templating knockout-components
有没有办法配置一个Knockout组件来替换容器元素而不是将其内容嵌套在容器元素中?
例如,如果我有一个my-custom-element使用以下模板注册的自定义组件:
<tr>
    <p>Hello world!</p>
</tr>
是否可以使用这样的组件:
<table>
    <tbody>
        <my-custom-element></my-custom-element>
    </tbody>
</table>
最终产品是这样的:
<table>
    <tbody>
        <tr>
            <p>Hello world!</p>
        </tr>
    </tbody>
</table>
而不是:( Knockout默认情况下渲染组件的方式)
<table>
    <tbody>
        <my-custom-element>
            <tr>
                <p>Hello world!</p>
            </tr>
        </my-custom-element>
    </tbody>
</table>
根据这个问题的答案,似乎这个功能内置于模板引擎中,我假设在渲染组件模板时也会使用它.
是否存在指定的组件应与呈现方式renderMode的replaceNode?
我知道"虚拟元素"语法,它允许在HTML注释中定义组件:
<table>
    <tbody>
        <!--ko component { name: 'my-custom-element' }--><!--/ko-->
    </tbody>
</table>
但我真的不喜欢这种语法 - 在评论中编写真正的代码感觉就像一个肮脏,肮脏的黑客.
我想,考虑到库的性质(在那里,我说过)和开发人员的团队理念,可以这样为缺少此选项进行辩护:
Knockout 是一个库,与其他 MVC 不同,它不会强制您使用框架定义的方式来构建您的应用程序。如果您将 Knockout 中的模板引擎与几乎所有其他 JS 模板引擎(Angular、下划线、mustache 等)相比,Knockout 是唯一一个不“修改”原生 HTML5 渲染的引擎。所有其他人都使用自定义标签,无论是它<% %>还是{{ }}需要一个小的 JS 解析器来将标签转换为有意义的东西(现在 KO 也有一个Knockout 打孔插件,其中包含小胡子风格的标签,诚然 KO 确实“犯了一点罪”有<!-- ko -->评论)。KO 使用 HTML 5 自定义元素、注释和属性标签,完全是“原版”。
例如,使用了 JS/DOM 类型的“对象(和现实生活?)层次结构”:只有父母才能对他们的孩子行使权力,因此绑定元素不会被替换,而是随着孩子被扩大。举例说明:
// we cannot do this in JS
document.getElementById('elem').remove(); //implied .remove(self)
// instead we do this
var elem = document.getElementById('elem');
container = elem.parentNode.removeChild(elem);
随后,使用 KO 进行数据绑定的首选方式(通过foreach绑定很好地说明)是:
<div data-bind="foreach: myList">
  <span data-bind="text: $data"></span>
</div>
前面的片段是 JS 数组的 HTML 表示,层次结构再次可见:
var myArr = [1,2,3,4,5];
// we cannot do the following without reference to the array index, 
// which is not held by the object itself,     
// but a meta-property getting meaning relative to the parent
myArr[0].splice(0,1); //remove
这导致您的 HTML 视图完美地复制了您的 JS 数据(看到有人构建了一个工具来显示HTML 文档中的数据绑定缩进级别(带有with和foreach)会很有趣。但是,在某些情况下,您需要注释标签,以免破坏 HTML 的布局或 css 规则(嵌套),例如要在文本节点之间注入的“纯文本”组件 (i18n):
<p>Some predefined text with
<!-- ko text: 'some variable text' --><!-- /ko -->
and more predefined text</p>
或者当您不希望空元素在隐藏时占用空间时
<!-- ko if: !hidden() --><div id="myToggleableDiv"></div><!-- /ko -->
然后是自定义标签,它们是标准化的,而且更加清晰;但不幸的是还没有 100% 准备好。选择data-bind第一个、<!-- ko -->第二个和<custom>第三个(如果完全实施会更高)。反正我是这么看的。至于您的具体情况,如果您的组件包含列表模型,您可以执行以下操作:
<table data-bind="{component: {name: 'custom', params {..}}"></table>
并tbody在您的 VM 中包含,否则如果它是列表项模型,您可以使用三种“语法”中的任何一种,例如注释语法
<table>
  <tbody data-bind="foreach: mylist">
    <!-- ko component: {name: 'custom', params: $data} --><!-- /ko -->
  </tbody>
</table>
或者将您的组件与嵌套在特定父级(表)中的要求完全分离,遵守SOC 原则,例如:
<table>
  <tbody data-bind="foreach: mylist">
    <tr data-bind="foreach: properties">
      <td data-bind="component: {name: 'custom', params: $data}></td>
    </tr>
  </tbody>
</table>
或使用自定义标签:
<table>
  <tbody data-bind="foreach: mylist">
    <tr data-bind="foreach: properties">
      <td><custom params= "{data: myData"></custom></td>
    </tr>
  </tbody>
</table>
按照优先顺序..
| 归档时间: | 
 | 
| 查看次数: | 3729 次 | 
| 最近记录: |