使用Knockout JS将多个不同的JSON源映射到一个视图模型中

时间:2013-05-22 11:14:59

标签: javascript json knockout.js knockout-mapping-plugin

我正在尝试将多个(不同的)JSON源映射到一个viewModel中,但我似乎无法让它工作。

我创建了一个viewModel:

    var viewModel;

我创建了不同的映射选项,如下所示:

    var mappingPerformedActions = {
        'PerformedActions': {
            key: function(data) {
                return ko.utils.unwrapObservable(data.Id);
            }
        }
    };

    var mappingEntities = {
        'Entities': {
            key: function(data) {
                return ko.utils.unwrapObservable(data.Id);
            }
        }
    };

然后我构建了我的get函数:

    get = function() {

        $.getJSON("localhost/urlWhichWorksWithSingleMapping", function(getdata) {
            viewModel = ko.mapping.fromJS(getdata, mappingEntities );
        });

        $.getJSON("localhost/anotherUrlWhichWorksWithSingleMapping", function(getdata) {
            ko.mapping.fromJS(getdata, mappingPerformedActions, viewModel);
        });

            ko.applyBindings(viewModel);
    };

get();

然后我尝试循环实体

<ul data-bind="foreach: BiztalkEntities">
    <li><span data-bind="text: Name"></span></li>
</ul>

适用于单一来源

请注意,当我只有一个源时,所有这些都有效,因此URLS或其他内容没有错误。我已经查看了堆栈溢出,但似乎无法找到符合我需求的示例,我希望你能告诉我我在这里做错了什么!

1 个答案:

答案 0 :(得分:2)

让viewModel具有两个不同的属性并映射到那些属性。否则,您需要将数据合并到单个数组中:

var viewModel = {PerformedActions:[],实体:[]};

然后分配收到的数据:

   $.getJSON("localhost/urlWhichWorksWithSingleMapping", function(getdata) {
        viewModel.PerformedActions = ko.mapping.fromJS(getdata, mappingEntities );
    });


    $.getJSON("localhost/anotherUrlWhichWorksWithSingleMapping", function(getdata) {
        viewModel.Entities = ko.mapping.fromJS(getdata, mappingPerformedActions);
    });

这是异步的,所以在绑定时你仍然没有数据。这是我能提出的最好的,不是很清楚问题出在哪里。检查控制台是否有错误,这有助于您了解问题所在。