使用ko.mapping插件时,IF绑定无法正常工作

时间:2014-10-22 12:26:15

标签: javascript knockout.js

我已经使用knockout.js创建了两个用于映射数据的JSFiddle示例。

(1)http://jsfiddle.net/9nn2qpp8/没有ko.mapping插件

var ViewModel = function() {
    var self = this;
    this.entries = [
        { name: "one", type: "file" },
        { name: "two", type: "folder" },
        { name: "three", type: "file" }
    ];

};

ko.applyBindings(new ViewModel());

(2)http://jsfiddle.net/q49vfy6q/使用ko.mapping

var data = {entries: [
    { name: "one", type: "file" },
    { name: "two", type: "folder" },
    { name: "three", type: "file" }
]};

var viewModel = ko.mapping.fromJS(data);

ko.applyBindings(viewModel);

为什么(2)与(1)关于if绑定的评估的工作方式不同?

3 个答案:

答案 0 :(得分:0)

映射插件会自动将所有内容包装为可观察对象 - 您需要在if绑定中对其进行处理:

<!-- ko if: type() !== "file" -->

而不是:

<!-- ko if: type !== "file" -->

working fiddle

答案 1 :(得分:0)

因为当您使用映射时,您将每个属性转换为可观察的。

每个可观察属性都是一个函数,因此您需要执行该函数以返回其中的值。

在此处查看:http://jsfiddle.net/q49vfy6q/1/

<table> <tbody data-bind="foreach: entries()"> <tr> <td> <!-- ko if: type() === "file" -->

答案 2 :(得分:0)

您根本不需要使用mapping。您可以将data直接传递到applyBindings()

var data = {entries: [
    { name: "one", type: "file" },
    { name: "two", type: "folder" },
    { name: "three", type: "file" }
]};

ko.applyBindings(data);

JSFiddle demo