将JSON映射到Knockout Observable Array

时间:2013-07-15 14:25:14

标签: knockout.js knockout-mapping-plugin

第一个网络服务:(用户)

  

[{id:1,UserName:“Jhon”}]

第二个网络服务:(消息)

  

[{id:34,消息:“这是消息1”,UserId:1},{id:35,   消息:“这是消息2”,UserId:1}]

如何在两个ko.obervableArrays上面映射,以便我可以在UserId的基础上在我的Message ViewModel中获取UserName(“Jhon”)。

如您所知UserId:1是User的外键。

我希望用户使用Message和UserName。

  • data-bind =“text:UserName”

  • data-bind =“text:Message”

2 个答案:

答案 0 :(得分:2)

如果您使用像Breeze这样的javascript库,您的生活将会大大简化。如果没有Breeze,您将需要在JavaScript中创建模型类,就像在EF的模型类中一样。基本上,您需要维护后端模型定义以及前端模型定义,并确保它们匹配。

我强烈建议您查看breezejs.com,因为我无法强调这会让您的生活变得多么容易。 Breeze可以从您的EF datacontext继承您的元数据,并从一开始就正确映射所有内容,它与淘汰赛携手合作,它将为您节省数周的开发时间。

如果需要,还可以使用Knockout映射插件Using Knockout mapping for complex JSON

答案 1 :(得分:1)

您可以使用映射插件的create选项来包含用户数据,如下所示:http://jsfiddle.net/H4QfX/

var userData = [{id:1, UserName:"Jhon"}],
    messageData = [{id:34, Message:"This is a message 1", UserId:1}, {id:35, Message:"This is a message 2", UserId:1}];

var users = ko.mapping.fromJS(userData);
var viewModel = ko.mapping.fromJS(messageData, {
    'UserId': {
        create: function(options) {
            return ko.utils.arrayFirst(users(), function(u) {
                if (u.id() == options.data) {
                    return u;
                }
            });
        }
    }});

ko.applyBindings(viewModel);