Knockout js使用knockout安全绑定在click数据绑定中传递参数

时间:2015-11-18 02:22:34

标签: knockout.js

我试图在我的淘汰赛js上实现ksb但是在onClick绑定中传递params会导致错误。

我用过这一行:

<button type="button" data-bind="click: btnClick.bind($data, '1')">button</button>

会抛出错误:

Uncaught #<Object> knockout-secure-binding.js: 440

如何在onClick绑定上传递param?

1 个答案:

答案 0 :(得分:1)

documentation for ksb说(注意特别注意#3,添加了粗体):

  

KSB中绑定中使用的语言是JSON的超集,但是a   Javascript的子集。我会称它为sbind语言,因为   便利性。

     

Sbind语言比Javascript更接近JSON,所以它更容易   通过将其与JSON进行比较来描述其差异。 sbind语言   与JSON的不同之处在于:

     
      
  1. 它了解undefined关键字;
  2.   
  3. 它会在$data$context或全局(按此顺序)中查找变量;
  4.   
  5. 可以调用函数(但不接受参数);
  6.   
  7. 调用顶层函数,this设置为具有以下键的对象:$data$context,全局,$element,对应   到相应元素的状态。
  8.   

要解决此限制,您可以使用自定义绑定处理程序来包装其他自定义绑定处理程序,并为它们提供绑定函数。

ko.bindingHandlers.curry = {
    unwrap: function (valueAccessor, data) {
        var val = valueAccessor(),
            theFunction = data[val[1].token];
        return {
            bh: ko.bindingHandlers[val[0]],
            fnVa: function () {
                return theFunction.apply.bind(theFunction, theFunction, val.slice(2));
            }
        };
    },
    init: function (element, valueAccessor, allBindingsAccessor, data, context) {
        var spec = ko.bindingHandlers.curry.unwrap(valueAccessor, data),
            init = spec.bh.init;
        if (init) {
            init(element, spec.fnVa, allBindingsAccessor, data, context);
        }
    },
    update: function (element, valueAccessor, allBindingsAccessor, data, context) {
        var spec = ko.bindingHandlers.curry.unwrap(valueAccessor, data),
            update = spec.bh.update;
        if (update) {
            update(element, spec.fnVa, allBindingsAccessor, data, context);
        }
    }
};

像这样使用它:

<button type="button" data-bind="curry:['click', btnClick, '1', '2']">short</button>

Demo fiddle