【问题标题】:Knockout - Unable to process binding - With淘汰赛 - 无法处理绑定 - 有
【发布时间】:2017-10-24 12:55:47
【问题描述】:

我对 KnockoutJS 还是比较陌生,我遇到了绑定问题,看不出哪里出了问题。我尝试了各种方法,但似乎没有任何效果。我确信可能有一个简单的解决方案,我只是看不到它!

我正在通过 ajax 调用数据并尝试从文本框中的数据中显示一项,然后可以对其进行更新。我在控制台中收到以下错误:

Uncaught ReferenceError: Unable to process binding "with: function (){return KHAViewModel }“消息:无法处理绑定”与: function (){return fundedWTEResults }" 消息:无法处理 绑定“textInput:函数(){return ActualFundedWTE}”消息: ActualFundedWTE 未定义

下面是我的代码的精简版,我用一些 JS 复制了我的 ajax 脚本。我也在jsFiddle上复制了它:

HTML

<div class="container">
  <pre data-bind="text: ko.toJSON($data, null, 2)"></pre>
</div>

<div class="container" id="dateSearch" >
  <h2></h2>
  <form class="form-inline" data-bind="with: KHAViewModel">
    <div class="form-group" data-bind="with: fundedWTEResults">
      <span>Funded WTE: </span>
      <input id="fundedWTE" data-bind="textInput: ActualFundedWTE">
    </div>
  </form>
</div>

JS

// KHA View Model
function KHAViewModel() {
  var self = this;
  self.fundedWTEResults = ko.observableArray([]);

  function fundedWTE (team) {
  //  $.ajax({
  //    url: "/...",
  //    type: "POST",
  //        ...........
  //  });

    var r = [{"Team":team,"ActualFundedWTE":12.00}];
    ko.mapping.fromJS(r, {}, self.fundedWTEResults);
  }

  fundedWTE('TeamA');

}

// Master View Model
function masterVM() {
  var self = this;
  self.KHAViewModel = new KHAViewModel();

};

// Activate Knockout
ko.applyBindings(new masterVM());

【问题讨论】:

  • 我认为with: fundedWTEResults 绑定应该是foreach: fundedWTEResults 绑定,因为它是一个数组...
  • 就是这样!谢谢!
  • @user3297291 你想留下答案吗?或者我可以回答。
  • 感谢您给我机会添加答案,但我同意您添加自己的答案,因为这是一个小问题 :)

标签: javascript jquery html knockout.js knockout-mapping-plugin


【解决方案1】:

看来@user3297291 已经非常敏捷地解决了您的问题。

使用 ko.dataFor 和 ko.contextFor 可以帮助您日后调试这些类型的问题。特别是如果您使用的是 Chrome,控制台上的 $0 指的是开发人员工具中当前选定的元素。

选择您要调查的元素并在开发控制台中输入:

ko.dataFor($0)
ko.dataFor(document.getElementById("fundedWTE")) //Equivalent to this

它将显示该元素所绑定的内容,这通常足以帮助您了解绑定上下文的实际含义。

ko.contextFor 为您提供更多信息,如果您正在使用 $root、$parent、$parents 等,则非常方便。

【讨论】:

【解决方案2】:

感谢@user3297291 指出了明显的问题。

我使用的with: 绑定创建了一个新的binding context,以便将后代元素绑定在指定对象的上下文中。所以我的数组仍然是一个对象,因此无法以所需的方式访问数组中的对象。

要使用的正确绑定是foreach: 绑定,foreach 绑定为数组中的每个条目复制一段标记,并将该标记的每个副本绑定到相应的数组项。因此允许我在数组中的每个对象中显示单个值。

还要感谢@Chris 分享了一个很好的方法,可以在未来使用ko.dataFor() 代码调试此类问题。

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 2016-01-22
    • 2015-03-23
    • 2014-05-29
    • 2015-03-17
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多