链接Knockout自定义绑定

non*_*ame 3 javascript jquery custom-binding knockout.js

我有一个Knockout自定义绑定处理程序,我想在其中调用foreach绑定功能,然后调用回调函数.我一直得到一个"未捕获的错误:您不能多次将绑定应用于同一个元素."现在我尝试这样做时出错.

我的自定义绑定非常简单(typescript):

/// <reference path="knockout.d.ts" />
ko.bindingHandlers["postForeach"] = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        if (!allBindingsAccessor().postForeachCallback)
            throw "Callback not defined for postForeach binding!";

        //call foreach init functionality
        ko.bindingHandlers['foreach'].init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            //call foreach update functionality
            ko.bindingHandlers['foreach'].update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
            //call callback
            allBindingsAccessor().postForeachCallback();
    }
};
Run Code Online (Sandbox Code Playgroud)

在构建这个时我是否缺少一些东西?

谢谢!

编辑:

回调函数

self.populateMainContentWindow = function () {
                    var dataTable = $(this.tableId).dataTable();
        dataTable.fnDestroy();

                // create the datatable
                        var actualTable = this.jQuery(this.tableId);
        if (actualTable.length == 0) {
            return false;
        }

        // create the data table with options
        var newDataTable = actualTable.dataTable(this.options);

        // always set the width afterwards
        actualTable.css("width", "100%");
            };
Run Code Online (Sandbox Code Playgroud)

数据绑定签名(在'with'绑定内):

postForeach: array, postForeachCallback: $parent.viewModel().populateMainContentWindow
Run Code Online (Sandbox Code Playgroud)

Mic*_*est 6

Knockout使用返回值init来确定它是否应该处理元素的后代.您可以只返回foreach.init函数的值,也可以{ controlsDescendantBindings: true }init函数返回:

init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    if (!allBindingsAccessor().postForeachCallback)
        throw "Callback not defined for postForeach binding!";

    //call foreach init functionality
    return ko.bindingHandlers['foreach'].init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
},
Run Code Online (Sandbox Code Playgroud)

参考:http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html