2016-08-08 60 views
0

In einem Meteor Autoform (das klassische aldeed Paket mit: https://github.com/aldeed/meteor-autoform), habe ich ein verstecktes Feld 'score', dessen Wert eine Funktion von einem anderen Feld namens 'optionID' genannt.Meteor Autoform - Rechenwert für verstecktes Feld

{{#autoForm 
    class    = "autoform" 
    id     = dataID 
    collection   = (getCollection 'DataColl') 
    doc     = dataDoc 
    type     = "method-update" 
    meteormethod   = "DataColl.autoformUpsert" 
    singleMethodArgument = true 
    autosave    = true 
}} 

    {{> afQuickField 
    name   = 'optionID' 
    type   = "select-radio" 
    template  = "buttonGroup" 
    options  = scoreOptions 
    }} 

    {{> afQuickField 
    name   = 'score' 
    type   = "hidden" 
    value  = selectedOptionScore 
    }} 

{{/autoform}} 

Die Funktion selectedOptionScore auf dem ausgewählten Wert von ‚OptionID‘ (mit Autoform.getFieldValue) ist

Template.formTemplate.helpers({ 
    selectedOptionScore(): String { 
    const optionID = AutoForm.getFieldValue('optionID'); 
    const optionScore = someFunction(optionID); 
    return optionScore; 
    }, 
}); 

Das Problem hängt, dass der Wert von 'score' auf jeder automatische Speicherung des Formulars „hinter einer Änderung ist "der Wert von , was bedeutet, die Funktion Computing 'score' ist richtig, aber die Sicherung auf Mongo scheint vor dem 'score' Wert passiert zu sein passiert, so in Mongo, 'score' hat den Wert von was auch immer es war vor 'optionID' zuletzt geändert.

Zum Beispiel, wenn ich 'score' nicht ausgeblendet, so dass ich es ändern kann, wird die Änderung direkt in der Webseite seinen Wert in Mongo korrekt wiedergegeben. Das Ändern der 'optionID' in der Webseite führt jedoch zu dem Verhalten "eine Änderung zurück".

Gibt es eine Möglichkeit, ein Autoform-Feld eines Meteors von einem anderen Feld in der gleichen Form abhängig zu machen, ohne dass es automatisch mit einer Änderung "hinterherhinkt"?

Antwort

1

Anstatt einen Template-Helper zu verwenden, um den Wert Ihres ausgeblendeten score-Felds zu berechnen, sollten Sie sich die Verwendung eines autoform hook ansehen. Anstatt also Ihre selectedOptionScore Template Helfer verwenden, würden Sie einen Haken wie definieren:

AutoForm.addHooks(['your-form-id'], { 
    before: { 
    method-update(doc) { 
     doc.score = someFunction(doc.optionID); 
     return doc; 
    } 
    } 
}); 

Auf diese Weise kurz vor Ihrer Form die berechnete Punktzahl gespeichert wird gesetzt und gespeichert mit allem anderen.

+0

Perfekt. Genau das habe ich getan, um es zu lösen. Und als Kopf für jeden, der das sieht, denke ich, dass autovalues ​​auch gut gewesen wäre, wenn mein Schema spezifisch genug gewesen wäre. – tscizzle