【发布时间】:2014-08-11 15:09:27
【问题描述】:
我的视图模型是一个有场景的游戏,每个场景都有一些信息。
视图模型是一个普通的 JSON 对象,通过映射插件映射为可观察的。整个应用程序运行良好,所有数据绑定和其他功能都正常运行。但是……
我正在使用拖放来将消息添加到场景中,因此我在侧面呈现了空消息(不包含在场景消息数组中,而是作为独立对象),并且在放置拖动的消息时我'我把它推到了场景消息可观察数组中,当我查看我的游戏对象时,我可以看到已经添加了一条新消息,但在 ui 中没有任何效果,假设我们从 2 条消息开始数组,并且它们在应用程序的负载中呈现良好,现在我在数组中有 3 条消息,但在 ui 中只显示了 2 条。
以下是部分代码:
这是拖放代码-
(function () {
var _dragged;
ko.bindingHandlers.drag = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var dragElement = $(element);
var dragOptions = {
helper: 'clone',
appendTo: 'body',
revert: true,
revertDuration: 0,
start: function () {
_dragged = ko.utils.unwrapObservable(valueAccessor().value);
},
cursor: 'default'
};
dragElement.draggable(dragOptions).disableSelection();
}
};
ko.bindingHandlers.drop = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var dropElement = $(element);
var dropOptions = {
drop: function (event, ui) {
valueAccessor().value.push(ko.mapping.fromJS(_dragged));
}
};
dropElement.droppable(dropOptions);
}
};
})();
这个消息foreach与drop绑定-
<div id="sceneMessages" data-bind="foreach: game.ContentScenes()[0].ContentMessages(), drop: { value: game.ContentScenes()[0].ContentMessages() }">
<span data-bind="text: id"></span>
<br />
</div>
这是带有拖动的空的新消息 -
<ul data-bind="foreach: messagesTypes">
<li data-bind="text: MessageType.name, drag: { value: $data }"></li>
</ul>
知道我在做什么吗?难道是因为映射插件?!正如我提到的,新消息已正确添加到数组中。
编辑:
实际上,我刚刚意识到,即使是没有拖放的简单推送也无法正常工作..
来自服务器的 JSON 看起来像这样:
"ContentScenes": [
{
"ContentMessages": [
{
"PrivateMessageType": null,
"MessageType": {
"id": 1,
"name": "Public"
},
"id": 7,
"scene_id": 3,
"parent_id": null,
"time_offset": null,
"from": null,
"to": null,
"msg_type": 1,
"is_system": true
},
{
"PrivateMessageType": null,
"MessageType": {
"id": 1,
"name": "Public"
},
"id": 8,
"scene_id": 3,
"parent_id": null,
"time_offset": null,
"from": null,
"to": null,
"msg_type": 1,
"is_system": true
}
],
"ContentResources": [],
"id": 3,
"game_id": 28,
"name": null,
"discussion_duration": null,
"break_duration": null,
"vote_duration": null,
"is_template": true
},
{
"ContentDilemmaOptions": [],
"ContentMessages": [],
"ContentResources": [],
"id": 4,
"game_id": 28,
"name": null,
"discussion_duration": null,
"break_duration": null,
"vote_duration": null,
"is_template": false
}
],
"id": 28,
"mainImage": null,
"sideImage": null,
"description": "Game description",
"name": "Game Name",
"locale": null
这个 JSON 是这样映射的:
var Scene = function (data){
ko.mapping.fromJS(data,{},this);
this.isCurrent = function(){
return pageOptions.queryString("scene") == this.id();
};
this.url = function(){
return _url + this.id();
};
}
var mappingOptions = {
'ContentScenes':{
create:function(options){
return new Scene(options.data);
}
},
'ContentCharacters': {
key: function(data) {
return ko.utils.unwrapObservable(data.id);
}
}
}
var _gameJson = {
game: ko.mapping.fromJS(_jsonObject,mappingOptions)
}
ko.applyBindings(_gameJson);
那么,知道我在做什么吗?
【问题讨论】:
标签: knockout.js knockout-mapping-plugin