【问题标题】:Does calling ko.mapping.fromJS two time is right thing to do?两次调用 ko.mapping.fromJS 是否正确?
【发布时间】:2014-06-28 18:15:09
【问题描述】:

我正在使用淘汰映射插件将 JSON 数据映射到淘汰视图模型。问题是 JSON 来自服务器数据并不总是具有所有属性。但是我的计算出的可观察量引用了它们。因此,我使用空对象(templateStructure)在第一个映射中创建所有可观察对象,其中包含所有属性,然后使用实际数据进行 seocond 调用,以使用当前数据填充可观察对象。这很好,但想知道是否有更好的方法来处理这种情况?

这就是现在两次通话的情况。 templateStructure 是具有所有属性的虚拟对象,数据是实际数据。

ko.mapping.fromJS(templateStructure, {}, this);
ko.mapping.fromJS(data, {}, this);

【问题讨论】:

  • 抱歉,您需要提供更多信息。如果您的问题是关于性能的:不要问我们,只要run your horses。如果您的问题是关于审查您当前的方法:包含更多代码并转到 CodeReview.SE(尽管阅读他们的常见问题解答!)。如果您在 KO 性能方面遇到特定问题或错误:请提供足够的详细信息(完整重现)以便我们为您提供帮助。祝你好运!
  • 我的问题不是关于性能,而是在具有不同数据的同一对象上两次调用 mapping.fromJS 是否正确。

标签: json knockout.js knockout-mapping-plugin


【解决方案1】:

调用mapping.fromJS 来更新现有的视图模型是正确的。如果您使用 AJAX 接收模型的更新,这是最简单的方法(如果您不使用映射,则必须手动完成,逐个属性)。

您创建具有所有属性的“模板视图模型”的方法是好的,即使您没有在 JSON 响应中收到它,它们也存在。此外,更容易理解 JavaScript 代码:您不需要查看服务器端来发现视图模型中的属性,如果您直接从服务器进行第一个映射就会发生这种情况。

但是,如果接收到的模型几乎完整,您可以随时customize the "create" of your mapping(您可以使用 js hasOwnProperty 查找缺失的可观察属性并添加缺失的属性)。链接中文档的最后一个示例如此精确地如何添加新的 observable(在此示例中,计算 observable):

var myChildModel = function(data) {
  ko.mapping.fromJS(data, {}, this); // this is the view model

  this.nameLength = ko.computed(function() { // nameLength is added to the vm
      return this.name().length;
  }, this);
}

在此示例中,您可以添加条件以创建nameLength,仅当接收到的数据上不存在时,如下所示:

if (!data.hasOwnProperty('nameLength')) { 
   /* add the missing observ. property here */
}

(注意:如果需要,您还可以自定义更新)。

【讨论】:

    【解决方案2】:

    我已经使用 jQuery 扩展方法通过在映射之前合并对象来解决它。所以我只需要调用一次映射函数。

             var mergedData = jQuery.extend(true,data,templateStructure);
             ko.mapping.fromJS(mergedData, {}, this);
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2021-06-03
      • 2020-08-09
      • 2020-10-13
      • 2013-02-22
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多