Javascript Knockoutjs映射-无初始数据

Javascript Knockoutjs映射-无初始数据,javascript,asp.net-mvc,knockout.js,knockout-mapping-plugin,Javascript,Asp.net Mvc,Knockout.js,Knockout Mapping Plugin,使用knockoutjs,我试图映射一个大而复杂的数据段。我正在使用显示模块模式 为了使对象的所有元素都可见,我使用了映射插件。但是,我遇到了一个问题:我在任何地方都找不到使用ko.mapping.fromJS()的示例,其中一些初始数据没有映射到viewmodel对象上,但在我的例子中,在进行ajax调用并检索到一些数据之后,会在稍后进行映射。也就是说,我没有任何初始数据,因此需要初始映射充满空值、空值或默认值 这是唯一相关的信息 但这并不能真正解决同样的问题——或者至少,我不能让它解决同样

使用knockoutjs,我试图映射一个大而复杂的数据段。我正在使用显示模块模式

为了使对象的所有元素都可见,我使用了映射插件。但是,我遇到了一个问题:我在任何地方都找不到使用ko.mapping.fromJS()的示例,其中一些初始数据没有映射到viewmodel对象上,但在我的例子中,在进行ajax调用并检索到一些数据之后,会在稍后进行映射。也就是说,我没有任何初始数据,因此需要初始映射充满空值、空值或默认值

这是唯一相关的信息

但这并不能真正解决同样的问题——或者至少,我不能让它解决同样的问题

这大概是我得到的代码

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();
   });
});
所以,我的问题是,这个物体的初始载荷是多少?目前,我不得不设置空对象来实现这一点,手工编码每个对象的每个元素,正如前面提到的,映射的对象层次结构又大又复杂,所以这并不理想。非常感谢您的帮助


谢谢。

我通过将空数据模型作为ViewBag属性的一部分发送到视图(这是.NET MVC)并使用名为Ngon的库解决了这个问题(https://github.com/brooklynDev/NGon).

在剧本中:

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提供了不同的视角。

我很好奇为什么你不能在第一页请求中发送一个实际的空viewmodel?或者,如果数据确实是分离的,那么在第一次获得初始viewmodel的同时执行绑定,而不是在DOM上进行绑定。感谢您的评论。我最初是在对象可用时(即,在ajax请求之后)执行数据绑定的,但这会导致问题,因为每次ajax调用时(即在单击事件时)它都会调用ko.applyBindings()。然而,你评论的第一部分确实是我应该做的,而且很明显……我认为这是一个真正的树木之林。谢谢。另一个建议是将
MassiveDataModel
作为发送到视图的模型的属性,而不是使用Viewbag。这没有多大区别,但这是一个好习惯。我们的命名约定“DataModelViewContext”可能比“Massive”更有意义。避免使用ViewBag是一个必须的…有趣的概念,但是没有理由在运行时使用尚未存在的属性@run-time。我在使用这种模式时注意到的一点是,假设MassiveDataModel有其他子对象(在构建新MassiveDataModel()时默认为null)。。。。您必须确保提供一个默认的构造函数,以确保所有子对象都是“新”的。否则,当您稍后尝试填充这些子对象并通过HTML中的绑定访问它们时。。。。。它会抛出奇怪的错误。
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();
       });
    });