2016-08-08 4 views
0

流星オートフォーム(古典的なaldeedパッケージを使用:https://github.com/aldeed/meteor-autoform)では、'score'という名前のフィールドがあり、値は'optionID'という別のフィールドの関数です。Meteor autoform - 隠しフィールドの値を計算する

{{#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}} 

selectedOptionScore「はoptionID」の選択された値に依存する関数

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

問題を(Autoform.getFieldValueを使用して)、フォームの各自動保存に、'score'の値が「1つの変更の背後にあることです"'optionID'の値は、'score'の計算が正しいことを意味しますが、'score'値が更新される前にmongoへの保存が行われたようです。したがって、mongoでは、'score'の値は'optionID'が最後に変更されました。

たとえば、私が'score'を編集することができないようにすると、ウェブページで直接変更するとmongoに正しく反映されます。しかし、Webページの'optionID'を変更すると、「1つ後ろに戻る」という振る舞いが得られます。

流星自動フォームフィールドを、同じフォームの別のフィールドに依存させる方法はありますか?常に1つの変更で自動保存に遅れを取らないでください。

答えて

1

テンプレートヘルパーを使用して、非表示のscoreフィールドの値を計算する代わりに、autoform hookを使用して調べることができます。だからではなく、あなたのselectedOptionScoreテンプレートヘルパーを使用しての、あなたのようなフックを定義します

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

フォームが設​​定されて算出されたスコアを保存し、他のすべてと一緒に保存される直前にこの方法です。

+0

パーフェクト。実際、これは私がそれを解決するためにしたものです。そして、これを見ている人の頭として、私のスキーマが十分に特定されていれば、オートヴァージョンも良いと思います。 – tscizzle

関連する問題