KnockoutJS“未捕获的TypeError:无法处理绑定”

时间:2018-10-26 07:43:31

标签: javascript html json data-binding knockout.js

我有此代码:

<script>
    var viewModel = {};

    $.getJSON("URL", function (data) {
        viewModel = ko.mapping.fromJS(data);
        ko.applyBindings(viewModel);
    });
</script>

我将其绑定在以下代码中:

<!-- ko foreach: { data: object, as: 'object' } -->

   <div>
     ... content (with more data-bindings) ...
   </div>

<!-- /ko -->

但是我在控制台中收到这些错误:

  

未捕获的TypeError:无法处理绑定“ foreach:function(){返回{data:object,as:'object'}}”

     

消息:无法处理绑定(...)

     

消息:无法读取属性(...)

我敢肯定,这是因为可观察对象尚未预先定义,而在基因敲除JS试图绑定它们之前,它们根本不存在。

我尝试过:

var viewModel = {
    object: null
    (and other properties)
};

这:

function viewModel() {
var self = this;
...
}

但这没有帮助。我究竟做错了什么?我知道对此有很多疑问,但是我找不到我的问题的答案。

1 个答案:

答案 0 :(得分:0)

您只在 返回异步数据后才应用绑定。这不是理想的方法,但至少可以确保没有由于绑定到初始空对象而引起的问题。

设置视图的方式要求从服务器收到data才能满足此要求:

  • 必须是一个对象
  • 必须具有属性object
  • data.object的值必须是可迭代的

即:这应该有效:

ko.applyBindings({ object: [] })

如果数据是数组,则应将绑定重写为:

<!-- ko foreach: { data: $data, as: 'object' } -->
<div>Bind to object.someProp here</div>
<!-- /ko -->

如果您的数据是对象,例如:{ object: { a: 1 } },则可以删除foreach或使用with绑定。

一旦使它起作用,就应该在开始加载数据之前尝试使用占位符viewmodel应用绑定。这样可以确保在加载过程中呈现出漂亮的UI。