我试图在我的淘汰赛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?
答案 0 :(得分:1)
documentation for ksb说(注意特别注意#3,添加了粗体):
KSB中绑定中使用的语言是JSON的超集,但是a Javascript的子集。我会称它为sbind语言,因为 便利性。
Sbind语言比Javascript更接近JSON,所以它更容易 通过将其与JSON进行比较来描述其差异。 sbind语言 与JSON的不同之处在于:
- 它了解
undefined
关键字;- 它会在
$data
或$context
或全局(按此顺序)中查找变量;- 可以调用函数(但不接受参数);
- 调用顶层函数,
醇>this
设置为具有以下键的对象:$data
,$context
,全局,$element
,对应 到相应元素的状态。
要解决此限制,您可以使用自定义绑定处理程序来包装其他自定义绑定处理程序,并为它们提供绑定函数。
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>