knockoutjs映射到JSON多个数组

时间:2015-10-13 17:30:00

标签: javascript arrays json knockout.js

我已经将两个独立的列表(请求和公司)捆绑到一个JSON对象中,并且我试图将它映射到JavaScript端的两个淘汰对象。

最初,我一次只传递一个列表(没有JSON中的数组名称)或映射函数中的include行,它运行得很好。 一旦我将数组名称(例如" RequestList" =)添加到JSON,它就会停止工作。谢谢!

https://jsfiddle.net/yth4vx0z/1/

<table>
    <tbody data-bind="foreach:requests">
        <tr>
            <td data-bind="text:RequestID"></td>
        </tr>
    </tbody>
</table>

<table>
    <tbody data-bind="foreach:companies">
        <tr>
            <td data-bind="text:CompanyID"></td>
        </tr>
    </tbody>
</table>

以下是JavaScript代码:

    var myViewModel;
    $(function () {

        myViewModel = new viewModel();
        ko.applyBindings(myViewModel);
        myViewModel.load();
    });

    var requestModel = function (data) {
        var self = this;
        ko.mapping.fromJS(data, {}, self);
    }

    var companyModel = function (data) {
        var self = this;
        ko.mapping.fromJS(data, {}, self);
    }

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

        self.requestMapping = {
        include: ['RequestList'],
                create: function (options) {
                    return new requestModel(options.data);
                }
        };

        self.companyMapping = {
        include: ['CompanyList'],
                create: function (options) {
                    return new companyModel(options.data);
                }
        };

        self.requests = ko.observableArray();
        self.companies = ko.observableArray();

        self.load = function () {

            $.ajax(
            {
        json: ko.toJSON(fakeData)

        success: function (data) {
        ko.mapping.fromJS(data, self.requestMapping, self.requests);
        ko.mapping.fromJS(data, self.companyMapping, self.companies);
                },

                error: function () { 
                }
            });
        }
    }

var fakedata = 
    "RequestList": [
        {

        "RequestID": 12,
        "ContactID": 29
    }
],
"CompanyList": [
    {
        "CompanyID": 28,
        "Name": "CoName"
    },
    {
        "CompanyID": 29,
        "Name": "Name"
    }
]

1 个答案:

答案 0 :(得分:0)

标记中存在一些小错误,这些错误不允许脚本与映射问题分开工作,我无法真正理解为什么要尝试对没有类似的对象进行映射定义...例如Request JS对象具有RequestID和Name,而视图模型不包含任何这些字段......

我已经清理了您的代码以使用映射,您可以在此处查看工作示例 https://jsfiddle.net/ka4b1591/23/

据说,我建议你使用简单的映射将JS对象转换为View Models,使用下面的方法。

var fakeData = {
    "RequestList": [
        {
            "RequestID": 12,
            "ContactID": 29
        }
    ],
    "CompanyList": [
        {
            "CompanyID": 28,
            "Name": "CoName"
        },
        {
            "CompanyID": 29,
            "Name": "Name"
        }
    ]};

var myView = ko.mapping.fromJS(fakeData);

$(document).ready(function(){
    ko.applyBindings(myView);
});

和html

<table>
    <tbody data-bind="foreach:RequestList">
        <tr>
            <td data-bind="text:RequestID"></td>
        </tr>
    </tbody>
</table>

<table>
    <tbody data-bind="foreach:CompanyList">
        <tr>
            <td data-bind="text:CompanyID"></td>
        </tr>
    </tbody>
</table>

参考https://jsfiddle.net/fwq46ojf/3/

上的脚本

如果您只是计划使用JS字段

,则无需执行任何视图定义