使用knockoutjs,我正在尝试映射大量复杂的数据。我正在使用揭示模块模式。
为了使对象的所有元素都可以观察,我正在使用映射插件。但是,我遇到了一个问题:我无法在任何地方找到使用ko.mapping.fromJS()的示例,其中一些初始数据不映射到viewmodel对象上,但稍后映射,之后 - 在我的情况下 - 已经进行了ajax调用并检索了一些数据。也就是说,我没有任何初始数据,因此需要初始映射充满空值,空值或默认值。
这是唯一一个相关的信息
Knockout JS mapping plugin without initial data / empty form
但这并没有真正解决同样的问题 - 或者至少,我无法解决同样的问题。
这里大致是我得到的代码。
var viewModel = function(){
var farmyard = *** What?? ***;
var refreshData = function(){
var temp = null;
$.ajax(
// awesome server call etc
success: function(data){
temp = data;
}
);
ko.mapping.fromJS(temp, farmyard);
};
return{
farmyard: farmyard,
refreshData: refreshData
}
};
$(function(){
var vm = new viewModel();
ko.applybindings(vm);
$('#something).on('click',function(){
vm.refreshData();
});
});
所以,我的问题是,这个物体初始加载的农场是什么?目前,我不得不设置空对象以使其工作,手动编码每个对象的每个元素,并且如上所述,被映射的对象层次结构是大而复杂的,因此这不是理想的。任何帮助非常感谢。
感谢。
答案 0 :(得分:3)
我通过将一个空数据模型作为ViewBag属性的一部分发送到视图(这是.NET MVC)并使用名为Ngon的库(https://github.com/brooklynDev/NGon)解决了这个问题。 。
public ViewREsult Index()
{
var massiveDataModel = new MassiveDataModel();
ViewBag.NGon.Stuff = massiveDataModel;
return View();
}
在剧本中:
var viewModel = function(){
var farmyard = ko.mapping.fromJS(ngon.Stuff);
var refreshData = function(){
var temp = null;
$.ajax(
// awesome server call etc
success: function(data){
temp = data;
}
);
ko.mapping.fromJS(temp, farmyard);
};
return{
farmyard: farmyard,
refreshData: refreshData
}
};
$(function(){
var vm = new viewModel();
ko.applybindings(vm);
$('#something).on('click',function(){
vm.refreshData();
});
});
如此紧张,试图以某种方式解决问题,看不出明显的解决方案。感谢Tyrsius的不同观点。