3

使用 knockoutjs,我正在尝试映射大量复杂的数据。我正在使用显示模块模式。

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

这是任何地方唯一相关的信息

Knockout JS映射插件没有初始数据/空表单

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

这大概是我得到的代码。

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

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

谢谢。

4

1 回答 1

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

于 2012-11-13T08:18:28.260 回答