2016-01-24 20 views
11

Ich benutze collection2 und ich versuche, es zur Validierung zu bekommen ist eine spezifische Art und Weise. Ich ein Profil Schema habe, die wie diese Art von aussieht:Separate Formularvalidierung mit Meteor

Schema.UserProfile = new SimpleSchema({ 
    name: { 
     type: String, 
     optional: false 
    } 
    location: { 
     type: String, 
     optional: true 
    } 
    gender: { 
     type: String, 
     optional: false 
    } 
}); 

Schema.User = new SimpleSchema({ 
    username: { 
     type: String, 
     optional: true 
    }, 
    emails: { 
     type: Array, 
     optional: true 
    }, 
    "emails.$": { 
     type: Object 
    }, 
    "emails.$.address": { 
     type: String, 
     regEx: SimpleSchema.RegEx.Email 
    }, 
    "emails.$.verified": { 
     type: Boolean 
    }, 
    createdAt: { 
     type: Date 
    }, 
    profile: { 
     type: Schema.UserProfile, 
     optional: true 
    }, 
    services: { 
     type: Object, 
     optional: true, 
     blackbox: true 
    }, 
    roles: { 
     type: [String], 
     optional: true 
    }, 
    heartbeat: { 
     type: Date, 
     optional: true 
    } 
}); 

Meteor.users.attachSchema(Schema.User); 

nun auf meinem Anmeldeformular ich den Benutzer bin erfordern ihr Geschlecht zu wählen, und dann später, wenn sie sich anmelden, Benutzer werden mit einem separaten Formular präsentiert nach ihrem Namen und Ort fragen. Hier ist das Problem:

Das Registrierungsformular funktioniert und alles geht mit dem Speichern. Wenn sie versuchen, die innere Form mit Ort und den Namen zu speichern, wenn ich einen Fehler:

Error invoking Method 'updateProfile': Gender is required [400] 

Ich weiß, dass es passiert, weil es in dem Schema erforderlich ist, aber ich habe diese Informationen bereits erhalten. Wie brauche ich das nicht? Oder richte ich die Validierung pro Formular ein?

+0

Welche Art von zusätzlichen Details suchen Sie? –

+0

Ich suche nur ein bisschen mehr Feedback und eine elegantere Lösung. – SeanWM

Antwort

3

Vom SimpleSchema docs:

Say you have a required key "friends.address.city" but "friends.address" is optional. If "friends.address" is set in the object you're validating, but "friends.address.city" is not, there is a validation error. However, if "friends.address" is not set, then there is no validation error for "friends.address.city" because the object it belongs to is not present.

So ist der Fehler passiert, weil Sie beide Profile auf Formen und Geschlecht einschließlich sind innerhalb Profil nicht optional. Ich kann mich zwei Möglichkeiten, dieses Problem zu lösen:

  1. haben weitere Objekte unter Profil, das beide optional sind und enthält erforderlichen Felder für Namen/Standort auf einem (obwohl es scheint, wie Lage könnte in beiden Szenarien optional sein, basierend auf Ihr Code) und ein Pflichtfeld für das Geschlecht auf der anderen Seite. Ich mag diese Lösung nicht besonders, aber sie verhindert die Notwendigkeit einer Formularvalidierung.

  2. Verwenden Sie jQuery Formularvalidierung (ich verwende das Paket themeteorchef: jquery-Validierung) und machen Sie alle Felder im Profil optional.

  3. Es sieht auch so aus, als ob SimpleSchema eine Funktion für die optional-Eigenschaft akzeptiert, also könnten Sie dort eine benutzerdefinierte Logik verwenden - vielleicht erhalten Sie Argumente oder einen Kontext in dieser Funktion, mit dem Sie das tun können, was Sie wollen?

Hoffe, dass hilft!

3

Sie müssen die Validierung durch jQuery hinzufügen oder Sie können Toaster verwenden, um den Fehler auf der Clientseite anzuzeigen. Lesen Sie auch dies: link

3

Ich nehme an, Sie verwenden aldeed:autoform für Ihre Formulare. Wenn Sie im Formular normal type verwenden, müssen alle Felder, auch solche, die bereits ausgefüllt sind, ausgefüllt werden. Zwei Möglichkeiten, dies zu beheben:

  • Dirty Weg: Versteckte Feld mit dem vorgefüllten Wert festlegen. Sie können Ihren Formulartyp auch als updateas seen in the doc festlegen. Auf diese Weise wird simple-schema Ihre newDoc bereits mit Ihren vorherigen Einträgen ausgefüllt, ohne zu schreien.

Die Lösung Nummer zwei ist diejenige, die ich in den meisten Fällen verwende. Dieses Pluszeichen autoform's hooks gibt Ihnen genügend Flexibilität, um sich an die meisten Anwendungsfälle anzupassen.

3

Ich weiß nicht, ob es eine elegantere Lösung ist, aber wir haben aufgehört, SimpleSchemas an Dokumente in unserem aktuellen Projekt anzuhängen.

Wir haben stattdessen verschiedene Schemas im Namespace jeder Sammlung, eine für die Überprüfung der Benutzereingabe beim Einfügen, eine für die Aktualisierung und eine für das Füllen von defaultValue beim Einfügen eines neuen Dokuments (was entweder vom Client oder von der Server, in diesem Fall prüfen wir nicht auf Eingabe). Wir rufen .validate() oder .clean() auf, je nachdem, was wir tun wollen.

Mit geschickter Nutzung der Möglichkeit, Schemas aus Array von Schemas zu bauen, schreiben wir am Ende keine größeren Schemas (es gibt mehr davon), aber wir haben die totale Kontrolle darüber, wann wir welche Felder überprüfen überprüft.