第一个网络服务:(用户)
[{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”
答案 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);