Knockoutjs映射 - 没有初始数据

时间:2012-11-13 07:27:48

标签: javascript asp.net-mvc knockout.js knockout-mapping-plugin

使用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();
   });
});

所以,我的问题是,这个物体初始加载的农场是什么?目前,我不得不设置空对象以使其工作,手动编码每个对象的每个元素,并且如上所述,被映射的对象层次结构是大而复杂的,因此这不是理想的。任何帮助非常感谢。

感谢。

1 个答案:

答案 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的不同观点。