【问题标题】:Custom mapping the child array of objects and adding validation自定义映射对象的子数组并添加验证
【发布时间】:2014-08-12 22:29:38
【问题描述】:

从服务器接收到一个 JSON 字符串,我正在尝试使用 KO Mapping 插件自定义映射,以便我可以使用 KO 验证插件添加验证。

有一个名为 Player 的模型对象,它有一个名为 Trophies 的属性,它是一个对象数组。

// Business Objects
var myPlayer = function (player) {
this.ID = ko.observable(player.ID);
this.Name = ko.observable(player.Name).extend({required: true});
this.Rank = ko.observable(player.Rank);
this.Trophies = ko.observableArray(player.Trophies);
}

var myTrophy = function (trophy) {
this.Name = ko.observable(trophy.Name).extend({required: true});
this.Year = ko.observable(trophy.Year).extend({required: true});
}

我不知道如何调用 myTrophy,以便我可以自定义映射 Trophies 数组以及验证。

//KO binding
var playerModel = ko.mapping.fromJSON(jsonString, mapping);
ko.applyBindings(playerModel);

// Mapping
var mapping = {
    'Player': {
        create: function (options) {
            var _player = new myPlayer(options.data);
            return _player;
        }
    }
}

这里是jsfiddle

如果您在 jsfiddle 中注意到,如果我删除 Name 属性,我会收到验证消息“这是必需的”,同样我想获得奖杯名称和年份的验证消息。如果您需要更多详细信息,请告诉我。谢谢

【问题讨论】:

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


    【解决方案1】:

    有几种不同的方法可以实现这一点。

    一种方法是使用arrayMap utility functionplayer.Trophies 中的每个条目调用您的函数

     this.Trophies = ko.observableArray(ko.utils.arrayMap(player.Trophies, myTrophy));
    

    然后将myTrophy改成返回一个对象

    var myTrophy = function (trophy) {
      return { 
               Name:  ko.observable(trophy.Name).extend({required: true}),
               Year: ko.observable(trophy.Year).extend({required: true})
             }
      }
    

    【讨论】:

      【解决方案2】:

      您实际上并不需要您的myPlayer function(和myTrophy),因为除了验证之外,您将执行插件已经执行的操作。

      你可以这样做:

      // Mapping
      var mapping = {
          'Name': {
              create: function (options) {
                  return ko.observable(options.data).extend({ required: true });
              }
          },
          'Year': {
              create: function (options) {
                  return ko.observable(options.data).extend({ required: true });
              }
          }
      }
      

      插件将匹配所有属性 NameYear 以向它们添加验证。

      Demo

      【讨论】:

      • 谢谢。正如你所说,这将所有属性与这些名称匹配,我发现下面提到的 arraymap 实用函数很有用。
      猜你喜欢
      • 2018-05-14
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2016-09-28
      • 2014-11-15
      • 2020-04-23
      • 2012-07-08
      相关资源
      最近更新 更多