淘汰赛:无法解析绑定

时间:2014-07-28 01:41:43

标签: javascript html knockout.js

我遇到了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,这是一个“问题编号”并且更改首先更新当前当前的问题,然后将当前问题更改为一个新问题(其编号是原始参数) )。对不起这里的噪音。

1 个答案:

答案 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