2

从淘汰赛文档:

ko.bindingHandlers.<name>.preprocess(value, name, addBindingCallback)

参数

value : ...
name : ...
addBinding:一个回调函数,您可以选择使用它在当前元素上插入另一个绑定。这需要两个参数,名称和值。例如,在您的 preprocess 函数中,调用addBinding('visible', 'acceptsTerms()');以使 Knockout 的行为就好像该元素具有visible: acceptsTerms()绑定一样。

例如,我们可以有如下绑定:

ko.bindingHandlers.live = {
   preprocess: function (str, name, addBindingCallback) {
      addBindingCallback('value', str);
      addBindingCallback('valueUpdate', "'afterkeydown'")
   }
};
// Or
ko.bindingHandlers.log = {
   preprocess: function (str, name, addBindingCallback) {
      addBindingCallback('click', "function(){console.log('test');}");
   }
};

我的问题:
是否可以将方法范围内的变量传递preporcess给新添加的绑定?

ko.bindingHandlers.log = {
   preprocess: function (str, name, addBindingCallback) {
      // an object which is not in my viewmodel and context
      var $scoped_obj = get_from_some_external_service(str);
      // i want to pass `$scoped_obj` to the newly added click binding
      addBindingCallback('click', "function(){console.log($scoped_obj);}");
   }
};

那可能吗 ?如何 ?

4

2 回答 2

4

您现在尝试的方式不能,因为单击处理程序是由 a 评估的Function,它接受一个字符串作为函数体。范围在这一点上丢失。

您可以做的是创建一个静态函数,您可以在点击处理程序中调用该函数:

ko.bindingHandlers.log = {
    functions: [],
    preprocess: function (str, name, addBindingCallback) {
        var fnIndex = ko.bindingHandlers.log.functions.length;

        var $scoped_obj = {a: 'b'};
        ko.bindingHandlers.log.functions.push(function() {
            console.log($scoped_obj);
        });
        addBindingCallback('click', "ko.bindingHandlers.log.functions["+fnIndex+"]");
   }
};

http://jsfiddle.net/fpoeeb7L/

或者,您可以使用ko.toJSON在点击处理程序中创建变量:

ko.bindingHandlers.log = {
    preprocess: function (str, name, addBindingCallback) {
        var $scoped_obj = {a: 'b'};
        addBindingCallback('click', "function() { var $scoped_obj = " + ko.toJSON($scoped_obj) + "; console.log($scoped_obj); }");
   }
};

http://jsfiddle.net/5e5jbuum/

但是如果$scoped_obj包含函数,这将不起作用。

于 2014-12-02T11:13:48.123 回答
1

您可以使用自执行函数为作用域变量创建闭包。使用闭包创建作用域变量和使用它的函数,并返回函数,如下所示:

preprocess: (function() {
    var $scoped_obj = get_from_some_external_service(str);
    var fn = function(str, name, addBindingCallback) {
       // can use the scoped variable
    }; 
    return fn;
})();  // self-execution

但是,请考虑 Jeff Mercado 对您的问题的评论。

于 2014-10-30T09:29:44.067 回答