2015-03-27 4 views
7

Ich mache meine eigenen benutzerdefinierten Validierungen für bestimmte Felder, so dass nur bestimmte Werte akzeptiert werden (abhängig vom Feld) und der Rest abgelehnt wird. Ich möchte eine "Filter" -Funktion schreiben, die überprüft, welches Attribut die Validierung genannt wird und von dort entscheiden, welche Wörter das Attribut verwenden darf. So würde das Modell wie folgt aussehen:Wie kann man wissen, welches Attribut die Validierungsregel für die Wasserlinie genannt wurde?

module.exports = { 

    types: { 

     filter: function(attribute) { 

      if (attribute === 'number') { 
       switch(attribute.value) { 

        case 'one': 
         return true; 

        case 'two': 
         return true; 

        default: 
         return false; 

       } 
      } else if (attribute === 'color') { 
       switch(attribute.value) { 

        case 'red': 
         return true; 

        case 'blue': 
         return true; 

        default: 
         return false; 

       } 
      } 

     }, 


    }, 

    attributes: { 

     number: { 
      type: 'string', 
      required: true, 
      filter: true 
     }, 

     color: { 
      type: 'string', 
      required: true, 
      filter: true 
     } 
    } 
}; 

natürlich im normalen Sails.js Verhalten „attribute“ wäre nicht das Attribut sein, aber der Wert des Attributs. (Und attribute.value war nur ein Beispiel, was bedeutet, ich möchte den Attributwert drin).

Also, ich möchte attribute, um das eigentliche Attribut, das die Validierungsregel aufgerufen wird. Ist das mit Sails möglich? Ich meine, ich könnte eine Funktion für jedes Feld im Modell schreiben, aber es wäre schön, eine Funktion zu haben, die zu allen passt (ich habe viele davon).

Danke.

Antwort

1

Ok, also werde ich Ihre Frage beantworten, aber das ist vielleicht nicht genau das, was Sie wollen. Ein Attribut kann eine „Enum“ hat, das ist, wie wir Ihr Endziel erreichen würden:

attributes: { 
    state: { 
    type: 'string', 
    enum: ['pending', 'approved', 'denied'] 
    } 
} 

Aber Ich gehe davon aus, dass dieser Code nur ein konstruiertes Beispiel ist. Hier ist ein Weg, der meiner Meinung nach funktionieren würde.

module.exports = { 
 
     
 
     
 

 
     types: { 
 

 
      filter: function(attribute) { 
 

 
       if (attribute === 'number') { 
 
        switch(attribute.value) { 
 

 
         case 'one': 
 
          return true; 
 

 
         case 'two': 
 
          return true; 
 

 
         default: 
 
          this.validationErrors.push(attribute); 
 
          return false; 
 

 
        } 
 
       } else if (attribute === 'color') { 
 
        switch(attribute.value) { 
 

 
         case 'red': 
 
          return true; 
 

 
         case 'blue': 
 
          return true; 
 

 
         default: 
 
          this.validationErrors.push(attribute); 
 
          return false; 
 

 
        } 
 
       } 
 

 
      }, 
 

 

 
     }, 
 

 
     attributes: { 
 
      validationErrors:(function(){ 
 
       
 
       var errors = []; 
 
       
 
       return { 
 
       push:function(attr){ 
 
        errors.push(attr); 
 
       }, 
 
       get:function(){ 
 
        return errors; 
 
       } 
 
       }; 
 
       
 
      })(), 
 

 
      number: { 
 
       type: 'string', 
 
       required: true, 
 
       filter: true 
 
      }, 
 

 
      color: { 
 
       type: 'string', 
 
       required: true, 
 
       filter: true 
 
      } 
 
     } 
 
    };

Edit: ein Attribut Methode anstelle eines Attributs Gebrauchte

Es gibt möglicherweise ein paar Probleme mit dieser Antwort. Ich bin mir nicht sicher, wie Waterline "das" innerhalb dieser benutzerdefinierten Typenfunktionen behandelt. Ist "das" an das Modell gebunden? Oder die Instanz des Modells, das wir erstellen? Es gibt eine Menge Fragen, die hier gestellt werden müssen, aber vielleicht kann dies Ihnen einige Ideen geben und eine Diskussion auslösen.

Verwandte Themen