2013-07-15 81 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有兩個完全獨立的問題區域,它們完全不重疊,而且實際上在一起工作得非常好。不知道你在哪裏或如何制定了自己的意見,但顯然沒有充分了解並會讓別人感到困惑。 –