Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js 使所有模板foreach绑定具有相同的afterAdd和beforeRemove事件函数_Knockout.js_Knockout 2.0_Event Binding - Fatal编程技术网

Knockout.js 使所有模板foreach绑定具有相同的afterAdd和beforeRemove事件函数

Knockout.js 使所有模板foreach绑定具有相同的afterAdd和beforeRemove事件函数,knockout.js,knockout-2.0,event-binding,Knockout.js,Knockout 2.0,Event Binding,我需要一种方法使Knockout中的所有模板绑定相同的事件函数,例如: ko.bindingHandlers.foreach.afterAdd = function(){ ... } ko.bindingHandlers.myTemplate = { init: function (element, valueAccessor, allBindings, value, context) { var options = ko.unwrap(valueAccessor())

我需要一种方法使Knockout中的所有模板绑定相同的事件函数,例如:

ko.bindingHandlers.foreach.afterAdd = function(){ ... }
ko.bindingHandlers.myTemplate = {
    init: function (element, valueAccessor, allBindings, value, context) {
        var options = ko.unwrap(valueAccessor());

        if (options && typeof options === "object" && options.foreach) {
            options.afterAdd = ko.bindingHandlers.myTemplate.afterAdd;
            options.beforeRemove = ko.bindingHandlers.myTemplate.beforeRemove;
        } 

        ko.applyBindingsToNode(element, {
            template: options
        }, context);


        return {
            controlsDescendantBindings: true
        };
    },
    beforeRemove: function (element, data) {
        console.log("remove", element, data);

        ko.removeNode(element);
    },
    afterAdd: function (element, data) {
        console.log("add", element, data);
    }
};

您可以为模板绑定编写一个包装器,在
foreach
场景中添加这些选项。也许是这样的:

ko.bindingHandlers.foreach.afterAdd = function(){ ... }
ko.bindingHandlers.myTemplate = {
    init: function (element, valueAccessor, allBindings, value, context) {
        var options = ko.unwrap(valueAccessor());

        if (options && typeof options === "object" && options.foreach) {
            options.afterAdd = ko.bindingHandlers.myTemplate.afterAdd;
            options.beforeRemove = ko.bindingHandlers.myTemplate.beforeRemove;
        } 

        ko.applyBindingsToNode(element, {
            template: options
        }, context);


        return {
            controlsDescendantBindings: true
        };
    },
    beforeRemove: function (element, data) {
        console.log("remove", element, data);

        ko.removeNode(element);
    },
    afterAdd: function (element, data) {
        console.log("add", element, data);
    }
};

示例:

是否有任何可能的方法来保留
模板
键?覆盖
模板如何?
?您可以保存对原始模板的引用,并像这样使用它:听起来不错!虽然它打破了不修改你不拥有的对象的原则,但它看起来仍然是我可以应用的唯一可能的解决方案。。。谢谢!有什么原因不能将其与其他名称一起使用:
myTemplate