2013-07-15 83 views
0

第一web服务:(用户)映射JSON入敲除可观察阵列

[{ID:1,用户名: “JHON”}]

第二web服务:(消息)

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

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

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

我想用户消息和用户名是这样的。

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

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

+0

这两项服务从完全独立的数据源拉动?它们是否映射到后端?最后,您是使用EF还是提供您自己的元数据 –

+0

这两个Web服务都来自相同的数据源。 是的,我是用户EF和MVC Web API。 –

回答

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); 
2

如果你使用像清风你生活中的JavaScript库将是非常简化。如果没有Breeze,您将需要在JavaScript中创建模型类,就像您在EF的模型类中所做的那样。基本上,您需要维护后端模型定义以及前端模型定义,并确保它们匹配。

我强烈建议看看breezejs.com,因为我无法强调足够多这会让你的生活。 Breeze可以从EF数据上下文继承你的元数据,并从一开始就正确映射所有内容,它可以与knockout一起使用,它可以为你节省数周的开发时间。

如果你愿意,你也可以利用基因敲除映射插件Using Knockout mapping for complex JSON

+1

我已经听说过BreezeJS,这很好。我会详细了解这个框架。谢谢 –

+0

Knockout> Breeze – beauXjames

+0

@beauXjames Knockout和Breeze有两个完全独立的问题区域,它们完全不重叠,而且实际上在一起工作得非常好。不知道你在哪里或如何制定了自己的意见,但显然没有充分了解并会让别人感到困惑。 –