2015-03-27 29 views
7

Wykonuję własne, niestandardowe sprawdzenia poprawności w niektórych polach, więc tylko niektóre wartości są akceptowane (w zależności od pola), a pozostałe odrzucane. Chciałbym napisać funkcję "filtrującą", która sprawdzi, jaki atrybut zwany jest sprawdzaniem poprawności, a następnie decyduje, jakie słowa dany atrybut może użyć. Więc model będzie wyglądać mniej więcej tak:Jak sprawdzić, który atrybut nazywa się zasadą walidacji linii wodnej?

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 
     } 
    } 
}; 

oczywiście w normalnym zachowaniem Sails.js „attribute” nie byłoby atrybut, ale wartość atrybutu. (I attribute.value był tylko przykładem, co oznacza, że ​​chcę tam wartość atrybutu).

Chcę, aby attribute był faktycznym atrybutem, który wywołał regułę sprawdzania poprawności. Czy to możliwe z żaglami? To znaczy, mógłbym napisać funkcję dla każdego pola w modelu, ale byłoby miło mieć funkcję, która pasowałaby do wszystkich (mam ich wielu).

Dzięki.

Odpowiedz

1

Ok, więc odpowiem na twoje pytanie, ale może to nie być dokładnie to, czego chcesz. Atrybut może mieć „enum”, który jest jak chcemy osiągnąć końcowy cel:

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

Ale będę zakładać, że ten kod jest tylko wymyślony przykład. Oto sposób, który moim zdaniem zadziałałby.

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: Używana metoda atrybut zamiast atrybutu

Istnieje potencjalnie kilka problemów z tym odpowiedź. Nie jestem pewien, w jaki sposób linia wodna obsługuje "to" w ramach tych niestandardowych funkcji. Czy "to" jest związane z modelem? Lub instancji modelu, który tworzymy? Jest tu wiele pytań, ale może to może dać ci kilka pomysłów i stworzyć dyskusję.