【问题标题】:Knockoutjs mapping - without initial dataKnockoutjs 映射 - 没有初始数据
【发布时间】:2012-11-01 15:46:37
【问题描述】:

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

为了使对象的所有元素都可观察,我使用了映射插件。但是,我遇到了一个问题:我在任何地方都找不到使用 ko.mapping.fromJS() 的示例,其中一些初始数据 not 映射到 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();
   });
});

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

谢谢。

【问题讨论】:

  • 我很好奇为什么你不能在第一页请求中发送一个实际的空视图模型?或者,如果数据确实是单独的,则在您首先获取初始视图模型的同时执行绑定,而不是在 DOM 就绪上。
  • 感谢您的评论。我最初是在对象可用时执行数据绑定(即,在 ajax 请求之后),但这会导致问题,因为每次调用 ajax 时(即在单击事件上)它都会调用 ko.applyBindings()。但是,您评论的第一部分确实是我应该做的,而且如此明显……我认为树木的真正木材。谢谢。

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


【解决方案1】:

我已通过将空数据模型(这是 .NET MVC)作为 ViewBag 属性的一部分发送到视图中并使用名为 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 提供不同的视角。

【讨论】:

  • 另一个建议是将MassiveDataModel 设置为您发送到视图的模型的属性,而不是使用 Viewbag。这并没有太大的区别,但它是一个好习惯。
  • 我们的“DataModelViewContext”命名约定可能比“Massive”更有意义。避免使用 ViewBag 是必须的……有趣的概念,但实际上没有理由拥有尚不存在的 @run-time 属性
  • 我在使用这种类型的模式时注意到的一件事是,假设 MassiveDataModel 有其他子对象(在构造新的 MassiveDataModel() 时默认为 null)......你有确保提供一个默认构造函数,以确保所有子对象也已“新建”。否则,当您稍后尝试填充这些子对象并通过 HTML 中的绑定访问它们时......它会引发奇怪的错误。
猜你喜欢
  • 2011-10-07
  • 2011-12-25
  • 2012-12-26
  • 1970-01-01
  • 2013-11-15
  • 2015-01-28
  • 2021-06-09
  • 2017-01-01
  • 1970-01-01
相关资源
最近更新 更多