KnockoutJS 3.X API 第五章 高级应用(3) 虚拟元素绑定

本文介绍如何在Knockout中使用虚拟元素进行高级绑定,包括控制流绑定和自定义绑定,并展示了如何使自定义绑定支持虚拟元素。

注意:这是一种高级技术,通常仅在创建可重用绑定的库时使用。 这不是你通常需要做的时候使用Knockout构建应用程序。

Knockout的控制流绑定(例如,if和foreach)不仅可以应用于常规DOM元素,而且可以应用于由基于特殊注释的语法定义的“虚拟”DOM元素。 例如:

<ul>
    <li class="heading">My heading</li>
    <!-- ko foreach: items -->
        <li data-bind="text: $data"></li>
    <!-- /ko -->
</ul>

自定义绑定也可以与虚拟元素一起使用,但要启用此功能,必须通过使用ko.virtualElements.allowedBindings API明确告知Knockout您的绑定理解虚拟元素。

示例

为了开始,这里是一个自定义绑定,随机化DOM节点的顺序:

ko.bindingHandlers.randomOrder = {
    init: function(elem, valueAccessor) {
        // Pull out each of the child elements into an array
        var childElems = [];
        while(elem.firstChild)
            childElems.push(elem.removeChild(elem.firstChild));
 
        // Put them back in a random order
        while(childElems.length) {
            var randomIndex = Math.floor(Math.random() * childElems.length),
                chosenChild = childElems.splice(randomIndex, 1);
            elem.appendChild(chosenChild[0]);
        }
    }
};
<div data-bind="randomOrder: true">
    <div>First</div>
    <div>Second</div>
    <div>Third</div>
</div>

但是,它不适用于虚拟元素。 如果您尝试以下操作:

<!-- ko randomOrder: true -->
    <div>First</div>
    <div>Second</div>
    <div>Third</div>
<!-- /ko -->

...那么你会得到错误绑定的“randomOrder”不能与虚拟元素一起使用。 让我们解决这个问题。 要使randomOrder可用于虚拟元素,请先通知Knockout允许它。 添加以下内容:

ko.virtualElements.allowedBindings.randomOrder = true;

现在不会有错误。 但是,它仍然无法正常工作,因为我们的randomOrder绑定是使用不理解虚拟元素的普通DOM API调用(firstChild,appendChild等)编码的。 这就是为什么KO要求你明确选择加入虚拟元素支持的原因:除非你的自定义绑定是使用虚拟元素API编码的,否则它不会正常工作!

让我们更新randomOrder的代码,这次使用KO的虚拟元素API:

ko.bindingHandlers.randomOrder = {
    init: function(elem, valueAccessor) {
        // Build an array of child elements
        var child = ko..firstChild(elem),
            childElems = [];
        while (child) {
            childElems.push(child);
            child = ko..nextSibling(child);
        }
 
        // Remove them all, then put them back in a random order
        ko..emptyNode(elem);
        while(childElems.length) {
            var randomIndex = Math.floor(Math.random() * childElems.length),
                chosenChild = childElems.splice(randomIndex, 1);
            ko..prepend(elem, chosenChild[0]);
        }
    }
};

请注意,我们现在使用的是ko.virtualElements.firstChild(domOrVirtualElement),而不是使用像domElement.firstChild之类的API。 randomOrder绑定现在将正确地使用虚拟元素,例如<! - ko randomOrder:true - > ... <! - / ko - >。

此外,randomOrder仍将使用常规DOM元素,因为所有ko.virtualElements API都与常规DOM元素向后兼容。

Virtual Element APIs(虚拟元素API)

Knockout提供了以下用于处理虚拟元素的功能。

  • ko.virtualElements.allowedBindings

    一个对象的键确定哪些绑定可与虚拟元素一起使用。 设置ko.virtual Elements.allowed Bindings.mySuper Binding = true以允许mySuperBinding与虚拟元素一起使用。

  • ko.virtualElements.emptyNode(containerElem)

    从真实或虚拟元素容器Elem中删除所有子节点(清除与其关联的任何数据,以避免内存泄漏)。

  • ko.virtualElements.firstChild(containerElem)

    返回实元素或虚拟元素容器元素的第一个子元素,如果没有子元素,则返回null。

  • ko.virtualElements.insertAfter(containerElem, nodeToInsert, insertAfter)

    插入节点插入作为实际或虚拟元素容器Elem的子元素,紧接在insertAfter之后的位置(其中insertAfter必须是containerElem的子元素)。

  • ko.virtualElements.nextSibling(node)

    返回在其真实或虚拟父元素中跟随节点的兄弟节点,如果没有下一个兄弟节点,则返回null。

  • ko.virtualElements.prepend(containerElem, nodeToPrepend)

    将nodePrepend插入为实元素或虚拟元素containerElem的第一个子元素。

  • ko.virtualElements.setDomNodeChildren(containerElem, arrayOfNodes)

    从真实或虚拟元素containerElem中删除所有子节点(在此过程中,清除与其关联的任何数据以避免内存泄漏),然后将所有节点fromarrayOfNodes作为其新子节点插入。

请注意,这并不意味着完全替代了一整套常规DOM API。 Knockout仅提供一组最小的虚拟元素API,以便在执行控制流绑定时执行所需的各种转换。

转载于:https://www.cnblogs.com/smallprogram/p/5968678.html

标题基于SpringBoot的马术俱乐部管理系统设计与实现AI更换标题第1章引言介绍马术俱乐部管理系统的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述马术俱乐部管理系统对提升俱乐部管理效率的重要性。1.2国内外研究现状分析国内外马术俱乐部管理系统的发展现状及存在的问题。1.3研究方法以及创新点概述本文采用的研究方法,包括SpringBoot框架的应用,以及系统的创新点。第2章相关理论总结和评述与马术俱乐部管理系统相关的现有理论。2.1SpringBoot框架理论介绍SpringBoot框架的基本原理、特点及其在Web开发中的应用。2.2数据库设计理论阐述数据库设计的基本原则、方法以及在管理系统中的应用。2.3马术俱乐部管理理论概述马术俱乐部管理的基本理论,包括会员管理、课程安排等。第3章系统设计详细描述马术俱乐部管理系统的设计方案,包括架构设计、功能模块设计等。3.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的交互方式。3.2功能模块设计详细介绍系统的各个功能模块,如会员管理、课程管理、预约管理等。3.3数据库设计阐述数据库的设计方案,包括表结构、字段设计以及数据关系。第4章系统实现介绍马术俱乐部管理系统的实现过程,包括开发环境、编码实现等。4.1开发环境搭建介绍系统开发所需的环境,包括操作系统、开发工具等。4.2编码实现详细介绍系统各个功能模块的编码实现过程。4.3系统测试与调试阐述系统的测试方法、测试用例以及调试过程。第5章系统应用与分析呈现马术俱乐部管理系统的应用效果,并进行性能分析。5.1系统应用情况介绍系统在马术俱乐部中的实际应用情况。5.2系统性能分析从响应时间、并发处理能力等方面对系统性能进行分析。5.3用户反馈与改进收集用户反馈,提出系统改进建议。第6章结论与展望总结马术俱乐部管理系统的设计与实现成果,并展望未来的研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值