【问题标题】:knockoutjs mapping to JSON multiple arraysknockoutjs 映射到 JSON 多个数组
【发布时间】:2016-01-11 13:49:51
【问题描述】:

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

最初,我一次只传递一个列表(在 JSON 中没有数组名称)或映射函数中的包含行,它工作得很好。 一旦我将数组名称(例如“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"
    }
]

【问题讨论】:

  • 我发现的一种解决方法是将数据对象的子集简单地传递给映射函数:ko.mapping.fromJS(data["RequestList"], self.requestMapping, self.requests);

标签: javascript arrays json knockout.js


【解决方案1】:

您的标记中存在一些小错误,除了映射问题之外,脚本无法正常工作,我无法真正理解您为什么要尝试对不具有相似性的对象进行映射定义 ... 例如 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 字段,则无需进行任何视图定义

【讨论】:

  • 感谢山姆的意见。我提供了我项目的准系统作为示例,仅包括几个示例字段。假设我想在表格中显示请求列表。但是,请求列表仅包含公司 ID,不包含公司名称。此外,同一页面将允许用户从下拉列表中选择新公司。我将这几个列表合并到一个 Ajax 调用中,因为有人告诉我,数据请求的块状比喋喋不休更好。
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多