自定义验证对象推送到数组

时间:2016-05-30 19:24:54

标签: arrays validation meteor meteor-autoform simple-schema

我正在使用类似于以下架构的东西 通过访问项目页面,我可以将相关项目添加到项目的相关项目数组字段中。

我想自定义验证推送的对象 Related Items 字段,以测试是否类似的对象已存在于数组中 - 所以我没有得到重复。

在我的下面的代码中,自定义验证不会触发。我希望这可能是因为自定义验证不能应用于type: [object],应该应用于对象的属性 - 但是我无法将对象作为一个整体进行测试。

const ItemsSchema = new SimpleSchema({
   name: {
    type: String,
    label: 'Name',
   },
   related: {
    type: [Object],
    label: 'Related Items',
    optional:true,
    custom: function () {
      let queryData = {  docId: this.docId, related: this.value }
      if (Meteor.isClient && this.isSet) {
        Meteor.call("relatedObjectIsUniqueForThisItem", queryData, 
         function (error, result) {
          if(!result){
            console.log("not unique");
            return "Invalid";
          }
          else{
            return true;
          }
        });
      }
    }

  },
  'related.$.name':{
    type: String,
    label:'Name',
  },
  'related.$.code':{
    type:String,
    label:'Code',
    min:5,
  },
});

1 个答案:

答案 0 :(得分:0)

我想出了解决这个问题的方法。

自定义验证不应该在[对象]上,而应该在对象的一个​​属性上 - 在这种情况下' source'或者'代码'。

在其中一个对象属性中,您可以调用this.siblingField(otherField);但这意味着您必须重建该对象。

就我而言: -

const ItemsSchema = new SimpleSchema({
   name: {
    type: String,
    label: 'Name',
   },
   related: {
    type: [Object],
    label: 'Related Items',
    optional:true,
  },
  'related.$.name':{
    type: String,
    label:'Name',
    custom: function () {

     //---------------------------
     //this is the important bit 
     //---------------------------
      let queryData = {  
           docId: this.docId, 
           related: {
              name:this.value,
              code:this.siblingField('code').value,  
            } 
      }

      //---------------------------
     //end of important bit 
     //---------------------------

      if (Meteor.isClient && this.isSet) {
        Meteor.call("relatedObjectIsUniqueForThisItem", queryData, 
         function (error, result) {
          if(!result){
            console.log("not unique");
            return "Invalid";
          }
          else{
            return true;
          }
        });
      }
    }

  },
  'related.$.code':{
    type:String,
    label:'Code',
    min:5,
  },
});