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());
如果我從這個JSFiddle(這是我想要的,因爲我只想呈現單個對話)中的JSON中刪除數組包裝,那麼我無法讓它工作。有任何想法嗎?
感謝安德斯。那麼約定是不同的情況下使用不同的映射?如果我正在處理一系列對話,我應該使用原始映射,而如果我正在處理單個對話,則應使用修改後的映射?我希望用一個映射來定義數據結構。你知道這是否記錄在任何地方?我看不到它在[鏈接]中提到http://knockoutjs.com/documentation/plugins-mapping.html – jonbeer
不管你只用一個對話,你總是可以使用一個數組嗎? – Anders
你也不能深層嵌套的映射文字,它需要提供每次你做ko.mapping.fromJS() – Anders