javascript - "Uncaught TypeError: Unable to process binding"与 KnockoutJS

标签 javascript html json data-binding knockout.js

我有这个代码:

<script>
    var viewModel = {};

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

我在这段代码中绑定(bind)它:

<!-- ko foreach: { data: object, as: 'object' } -->
   
   <div>
     ... content (with more data-bindings) ...
   </div>

<!-- /ko -->

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

Uncaught TypeError: Unable to process binding "foreach: function(){return { data:object, as:'object'} }"

Message: Unable to process binding (...)

Message: Cannot read property (...)

我敢肯定这是因为 observable(s) 不是预定义的,当 knockoutJS 试图绑定(bind)它们时,它们根本不存在。

我试过这个:

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

还有这个:

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

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

最佳答案

您只在您的异步数据返回后才应用绑定(bind)。这并不理想,但至少可以确保不会因绑定(bind)到初始空对象而导致问题。

View 的设置方式要求从服务器接收的数据满足此要求:

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

即:这应该有效:

ko.applyBindings({ object: [] })

如果您的数据是数组,您应该将绑定(bind)重写为:

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

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

一旦你让它工作,你应该在开始加载你的数据之前尝试应用占位符 View 模型的绑定(bind)。这可确保在加载期间呈现漂亮的 UI。

关于javascript - "Uncaught TypeError: Unable to process binding"与 KnockoutJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53003825/

相关文章:

javascript - 如何禁用 x-editable 中的 future 日期?

javascript - 无法将我本地开发的 Angular 模块导入 Angular 应用程序

javascript - 撤消 ( ctrl + z ) 功能以恢复隐藏的 div

javascript - 如果 javascript "async"函数的主体中没有 "await",它会以任何不同的方式执行吗?

html - Bootstrap 下拉菜单在轮播幻灯片中不起作用

html - 如何垂直对齐顶部和主菜单?

javascript - 在 img.onload 上留下处理程序是内存泄漏吗?

java - 如何发回另一个实体拥有的 JPA 实体的子集?

iphone - 来自 iPhone/iPad 的 json Web 服务

javascript - 将 JSON 从索引操作提供给公共(public)文件夹中的 index.html