我遇到了Knockout的问题。它告诉我它无法解析特定的绑定。如果我没有在我的HTML中包含绑定,页面将编译,我可以手动运行事件处理程序(在控制台中)。这是绑定的样子:
<!-- ko foreach: problems -->
<li data-bind="css: {active: $root.current.number() == $data.number() }">
<a data-bind="click: $root.setCurrent( $data.number ), text: $data.number">
<!-- /ko -->
我得到的错误是非常无益的
“无法解析绑定。 绑定值:单击:$ root.setCurrent($ data.number),text:$ data.number 消息:undefined不是函数“
当然,$ data非常明显没有定义。如果我删除对setCurrent
的调用,绑定编译文件,我可以在控制台中运行setCurrent
(并且它可以工作)。
setCurrent
处理程序在我的视图模型中定义为:
var ViewModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
}
$('document').ready( function () {
$.getJSON("@{PracticalWriteR}", function (data) {
viewModel = new ViewModel(data);
pager.extendWithPage(viewModel);
ko.applyBindings(viewModel);
pager.start();
viewModel.setCurrent = function (num) {
viewModel.problems()[viewModel.current.number() - 1].response(viewModel.current.problem.response());
viewModel.problems()[viewModel.current.number() - 1].marked(viewModel.current.problem.marked());
var neu = viewModel.problems()[num - 1];
viewModel.current.number(num);
viewModel.current.problem.answers(neu.answers());
viewModel.current.problem.response(neu.response());
viewModel.current.problem.practical.key(neu.practical.key());
viewModel.current.problem.practical.value.question(neu.practical.value.question());
viewModel.current.problem.practical.value.solution(neu.practical.value.solution());
viewModel.current.problem.marked(neu.marked());
viewModel.current.problem.number(neu.number());
};
});
});
这个想法是setCurrent
接受一个int,这是一个“问题编号”并且更改首先更新当前当前的问题,然后将当前问题更改为一个新问题(其编号是原始参数) )。对不起这里的噪音。
答案 0 :(得分:2)
当您将函数绑定到knockout中的事件时,通常会调用不带括号的函数(类似于使用addEventListener的方式)。
Knockout自动提供当前模型对象作为函数的第一个参数,然后将激活绑定的实际DOM事件作为第二个参数。
如果您将代码更改为:
,您的代码应该有效<a data-bind="click: $root.setCurrent, text: $data.number">
然后更改setCurrent函数以接受将数字包装为参数的Object。
如果要更改参数传递的顺序或方式,可以使用匿名函数修改此行为...对于您的情况,您可以执行类似
的操作<a data-bind="click: function(data, event) { $root.setCurrent($data.number) }, text: $data.number">
如果您不喜欢匿名函数,还有另一种使用myFunction.bind(param1, param2, ...)
语法的方法。
有关详细信息,请参阅点击绑定的淘汰文档:http://knockoutjs.com/documentation/click-binding.html