Knockout.js 将JSON映射到敲除可观察数组

Knockout.js 将JSON映射到敲除可观察数组,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,第一个web服务:(用户) [{id:1,用户名:“Jhon”}] 第二网络服务:(信息) [{id:34,Message:“这是一条Message 1”,UserId:1},{id:35, 消息:“这是一条消息2”,用户ID:1}] 如何映射上述两个ko.obervablearray,以便在基于UserId的消息视图模型中获取用户名(“Jhon”) 正如您所知,UserId:1是用户的外键 我想要像这样的用户信息和用户名 数据绑定=“文本:用户名” 数据绑定=“文本:消息” 如果您使用像Br

第一个web服务:(用户)

[{id:1,用户名:“Jhon”}]

第二网络服务:(信息)

[{id:34,Message:“这是一条Message 1”,UserId:1},{id:35, 消息:“这是一条消息2”,用户ID:1}]

如何映射上述两个ko.obervablearray,以便在基于UserId的消息视图模型中获取用户名(“Jhon”)

正如您所知,UserId:1是用户的外键

我想要像这样的用户信息和用户名

  • 数据绑定=“文本:用户名”

  • 数据绑定=“文本:消息”


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

我强烈建议您访问breezejs.com,因为我无法强调这会让您的生活轻松多少。Breeze可以从EF datacontext继承您的元数据,并从一开始就正确映射所有内容,它与knockout一起工作,将为您节省数周的开发时间


如果您愿意,还可以使用Knockout映射插件

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

我强烈建议您访问breezejs.com,因为我无法强调这会让您的生活轻松多少。Breeze可以从EF datacontext继承您的元数据,并从一开始就正确映射所有内容,它与knockout一起工作,将为您节省数周的开发时间


如果您愿意,还可以使用淘汰映射插件

您可以使用映射插件的
创建
选项来包含用户数据,如下所示:


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


这两个服务是否来自完全不同的数据源?它们是否映射到后端?最后,您是使用EF还是提供自己的metadataBoth web服务都来自同一数据源。是的,我是用户EF和MVCWebAPI。这两个服务是从完全不同的数据源获取的吗?它们是否映射到后端?最后,您是使用EF还是提供自己的metadataBoth web服务都来自同一数据源。是的,我是用户EF和MVCWebAPI。我已经听说过BreezeJS,它很好。我将阅读更多关于这个框架的内容。Thanks@beauXjames击倒和微风有两个完全独立的关注领域,它们根本不重叠,实际上一起工作非常好。我不知道你在哪里或如何表达你的观点,但它显然不是很灵通,会让其他人感到困惑。我已经听说过BreezeJS,它很好。我将阅读更多关于这个框架的内容。Thanks@beauXjames击倒和微风有两个完全独立的关注领域,它们根本不重叠,实际上一起工作非常好。不知道你在哪里或如何表达自己的观点,但显然信息不充分,会让其他人感到困惑。
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);