【问题标题】:Can I dynamically bind element inside custom binding?我可以在自定义绑定中动态绑定元素吗?
【发布时间】:2012-10-18 01:10:28
【问题描述】:

有没有办法从自定义绑定内部绑定元素?例如,我有自定义绑定并将其绑定到可观察的项目数组:

var someArrayOfItems = ko.observableArray(['item1', 'item2', 'item3']);
...
<div data-bind="myBinding: someArrayOfItems"></div>

现在我希望 myBinding 列出它必须喜欢的 div 元素中“someArrayOfItems”中的所有元素:

<ul data-bind="foreach: someArrayOfItems">
    <li>
        <span data-bind="text: $data"></span>
    </li>
</ul>

是否可以使用自定义绑定进行此类操作? 感谢您的帮助。

【问题讨论】:

    标签: knockout.js ko-custom-binding


    【解决方案1】:

    您可以使用函数ko.applyBindingsToNode 为元素动态添加绑定。

    在您的情况下,您还需要使用适当的“模板”填充内容。

    例如,您可以执行以下操作:

    ko.bindingHandlers.myBinding = {
        init: function(element, valueAccessor) {
            var ul = document.createElement("ul"),
                data = valueAccessor();
    
            //append a new ul to our element
            element.appendChild(ul);
    
            //could use jQuery or DOM APIs to build the "template"
            ul.innerHTML = "<li><span data-bind='text: $data'></span></li>";
    
            //apply foreach binding to the newly created ul with the data that we passed to the binding
            ko.applyBindingsToNode(ul, { foreach: data });;
    
            //tell Knockout that we have already handled binding the children of this element
            return { controlsDescendantBindings: true };
        }        
    };
    

    示例:http://jsfiddle.net/rniemeyer/z458E/

    【讨论】:

    • 谢谢,这很有帮助。我对这个解决方案有一个问题。如果我想要使用 input 元素而不是 span 元素来编辑列表中的每个项目,该怎么办。也有可能吗?我尝试简单地将跨度更改为输入,但它对我不起作用。
    • 您需要在数据结构中为其指定一个属性名称。比如:jsfiddle.net/rniemeyer/z458E/2
    • 我在将 someArrayOfItems 长度绑定到 div 时遇到问题。我不太确定为什么它不起作用。您能否检查示例jsfiddle.net/zbkkzdsp/U49gb 它大约是以下行:ko.applyBindingsToNode(div, { text: data().length })。这是绑定的,但是当元素数量发生变化时,不会重新计算。
    • 当您调用applyBindingsToNode时,Knockout 会收到您的代码被评估的结果(长度为 3)。它无法跟踪任何依赖项,也不会再次更新。如果需要进行计算,则需要将其放入计算中。类似:jsfiddle.net/rniemeyer/U49gb/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多