2013-10-03 27 views
1

我有一些問題找出爲什麼這個簡單的淘汰制映射不起作用。我不確定返回的JSON是否無效,或者我的映射是錯誤的,還是僅僅是綁定。Knockout Mapping插件和數據綁定從簡單的JSON

數據結構是父親對話對象與數組消息對象。

關於綁定我使用foreach:此刻的對話,因爲我有這個工作,如果我包裹整個事情一個單一的元素數組。

我綁定

<div data-bind="foreach: conversation"> 
    <div data-bind="foreach: messages"> 
    <div class="well"> 
     <div data-bind="text: sender_name"></div> 
     <div data-bind="text: subject"></div> 
     <div data-bind="text: body"></div> 
     <div data-bind="text: updated_at"></div> 
    </div>  
    </div> 
</div> 

我的視圖模型,僞造JSON和映射,當我返回包裹的單個元素數組中的JSON數據

// Sample JSON to return for initialization; 2 second delay 

var conversationData = { 
    json: $.toJSON(
     {"id":8,"subject":"Hello JB! Email two!", 
     "updated_at":"Sep 27", 
     "originator":"James Pablo", 
     "count_messages":"(2)", 
     "messages":[{"subject":"RE: Hello JB! Email two!", 
         "body":"Thanks for the message!", 
         "sender_name":"Joe Flynn","updated_at":"Sep 27"}, 
        {"subject":"Hello JB! Email two!", 
         "body":"Body text", 
         "sender_name":"James Pablo", 
         "updated_at":"Sep 27"} 
        ] 
     } 
), 
    delay: 1 
} 



function Conversation(data) { 
    ko.mapping.fromJS(data, {}, this); 
} 

function Message(data) {  
    ko.mapping.fromJS(data, {}, this); 
} 

var map = { 
    create: function(options) { 
    return new Conversation(options.data); 
    }, 
    messages: function(options) { 
    return new Message(options.data); 
    } 
} 


var ViewModel = function() { 
    var self = this; 
    self.conversation = ko.observable(); 

    // Use JSFiddle echo to simulate an AJAX service 
    (function() { 
    $.ajax({ url:"/echo/json/", data:conversationData, type:"POST", 
      success:function(data) 
      { 
       // Map the returned JSON to the View Model 
       ko.mapping.fromJS(data, map, self.conversation); 
      } 
      }); 
    })(); 

    console.log(self.conversation()); 

}; 

ko.applyBindings(new ViewModel()); 

This JSFiddle作品。

如果我從這個JSFiddle(這是我想要的,因爲我只想呈現單個對話)中的JSON中刪除數組包裝,那麼我無法讓它工作。有任何想法嗎?

回答

1

創建函數僅適用於數組。

從地圖字面試試這個

http://jsfiddle.net/C46pU/2/

刪除Convension,做

self.conversation(new Conversation(data)); 
+0

感謝安德斯。那麼約定是不同的情況下使用不同的映射?如果我正在處理一系列對話,我應該使用原始映射,而如果我正在處理單個對話,則應使用修改後的映射?我希望用一個映射來定義數據結構。你知道這是否記錄在任何地方?我看不到它在[鏈接]中提到http://knockoutjs.com/documentation/plugins-mapping.html – jonbeer

+0

不管你只用一個對話,你總是可以使用一個數組嗎? – Anders

+0

你也不能深層嵌套的映射文字,它需要提供每次你做ko.mapping.fromJS() – Anders