javascript-为什么我们不能在applyBindings()之前调用Uniform()?

当我们在UniformJS中使用Knockout并在ko.applyBindings之前调用.uniform()时,以下代码不起作用?

HTML代码:

<div id="myContainer">
    <div data-bind="foreach: teste">
        <input type="checkbox" value="" /> My checkbox
    </div>
</div>

JavaScript代码:

$("input").uniform();    // Call here... does not work!
function vm() {
    var that = this;

        this.teste = ko.observableArray([
            { id: 1, 'value': '1' },
            { id: 2, 'value': '2' },
            { id: 3, 'value': '3' },
        ]);    
}

ko.applyBindings(vm());
//$("input").uniform();    // Call here... works fine!!!

但是,如果在ko.applyBindings之后调用它,则一切正常.这是为什么?

请参阅this JSFiddle实时发布的问题.

解决方法:

淘汰赛可动态创建输入并将其添加到DOM.统一插件只能在现有元素上使用.如果在applyBindings之前在$(“ input”)上调用.uniform(),则没有输入:页面上唯一的输入是KO生成的三个输入的模板.

我建议您使用custom binding handler来处理此任务:

ko.bindingHandlers.uniform = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        $(element).uniform();
    }
};

可以这样使用:

<input type="checkbox" value="" data-bind="uniform" /> My checkbox

您还可以更改绑定以接受更多参数,然后像这样开始调用它:

<input type="checkbox" value="" data-bind="uniform: { wrapperClass: 'myClass' }" /> 

这是proof of concept,不过您也应该检查this answer,以了解将这样的选项传递到绑定的更可靠的实现.

所有这一切的附加优点是,您可以从视图模型中引导统一的行为,从而使所有内容都更具可测试性.

PS.一种可能适用的替代方法是使用template绑定的afterRender位.

上一篇:C/C++的几个输入流


下一篇:printk