2015-09-28 114 views
2

我使用偉大的aldeed:MeteorJS autoform包。我有一個自定義表單,可以讓我創建數據庫條目。MeteorJS AutoForm.Hooks不更新文檔

其中一個用戶輸入的表單字段是針對郊區的,我使用的是sergeyt:typeahead包,在用戶輸入時對此提出建議。

建議採用用戶熟悉的格式(本質上是「郊區,州,郵編」)。我稱之爲長途郊區。

然後,我使用AutoForm掛鉤之前從用戶選擇/輸入的longsuburb值中分離出Zipcode(「郵編」)值和「郊區」值。然後鉤子在提交之前將郊區和郵編值插入到文檔中。

這一切都很好。

現在我想創建一個編輯表單,用戶可以編輯詳細信息(按照計劃,我打算使用相同的表單來處理這兩個表單,但由於我是新手,所以我一次只能執行一個步驟)。

我已經設置了一個編輯表單模板,並根據AutoForm示例將類型設置爲「update」。

我可以成功編輯所有表單詳細信息並將它們保存到集合中,但我的AutoForm掛鉤似乎根本不會被調用,因此文檔的「郊區」和「郵編」值保留提交時也是如此。

我已經嘗試了幾種不同的方法,但主要是在黑暗中拍攝,所以任何建議都會很棒。

這裏的編輯表單模板

<template name="editBar"> 
    {{#autoForm collection="Bars" id="editBarsForm" template="bootstrap3-horizontal" label-class="col-sm-3" input-col-class="col-sm-9" type="update" doc=this}} 
    <fieldset> 
    <legend>Edit Bar</legend> 
    {{> afQuickField name='bar_name' placeholder="Name of the Bar, Pub, Venue" class="form-control typeahead" }} 
    {{> afQuickField name='image' class="form-control typeahead" }} 
    {{> afQuickField name='url' placeholder="Venue's Website" class="form-control typeahead" }} 
    {{> afQuickField name='longsuburb' placeholder="Suburb" class="form-control typeahead" autocomplete="off" spellcheck="off" data-source="getSuburbs"}} 
    {{> afQuickField name='barType' options=bartypes class="selectpicker"}} 
    </fieldset> 
    <button type="submit" class="btn btn-primary submit">Submit</button> 
    <a class="btn btn-danger delete" href="#">Delete post</a> 
    <a class="btn btn-default cancel" href="#">Cancel</a> 
    {{/autoForm}} 
</template> 

這裏就是我在編輯表單JS文件

 Template.editBar.helpers({ 
    getSuburbs: function() { 
    return AuPostcodes.find().fetch().map(function(it){ return it.longsuburb;  }); 
    console.log('it'); 
    }, 

    bartypes: function() { 
    return [ 
     {label: "Select", value: ""}, 
     {label: "Bar", value: "bar"}, 
     {label: "Pub", value: "pub"} 
    ]; 
    } 

}); 



    Template.editBar.rendered = function(){ 
    Meteor.typeahead.inject(); 
    }; 


    //Split out suburb and postcide from form's longsuburb string and submit with doc to Bars collection. 
    //"suburb" currently used for filtering. 

    AutoForm.hooks({ 
     editBarsForm: { 
      before:{ 
      insert: function(doc) { 
       var suburbString = doc.longsuburb; 
       var postcode = suburbString.substring(suburbString.lastIndexOf(",")+2,suburbString.length); 
       var suburb = suburbString.substring(0,suburbString.indexOf(",")); 
       doc.postcode = postcode; 
       doc.suburb = suburb; 
       return doc; //autoFrom magic commence 
       } 
      } 
      } 
     }); 

Template.editBar.events({ 
    'click .delete': function(e) { 
    e.preventDefault(); 

    if (confirm("Delete this bar?")) { 
     var currentBarId = this._id; 
     Bars.remove(currentBarId); 
     Router.go('barsList'); 
    } 
    }, 
    'click .cancel': function(e) { 
    e.preventDefault(); 
    Router.go('barsList'); 
    } 
}); 

添加模板和代碼都大致相同。正如我所說的,對於創建記錄來說,這一切都很好。我還可以編輯名稱,網址,longsuburb等,並將它們保存到數據庫中。這只是插件不工作。

+0

我已經更新了從「插入」到「更新」在JS鉤和我在瀏覽器控制檯以下錯誤:'[錯誤]類型錯誤: undefined不是一個對象(評估'suburbString.substring')' – SLRM

回答

3

謝謝@Johnny。那幾乎做了伎倆,但在你的幫助下,我能夠解決它。

基本上我有兩個問題。正如你所指出的那樣,我確實需要使用doc。$ set.key來更新郵編和郊區值。但我還需要使用AutoForm.getFieldValue回調來定義suburbString變量。

因此,完整的解決方案是這樣的:

//Split out suburb and postcode from form's long suburb sting and submit with doc to Bars collection. 
//"suburb" currently used for filtering. 

AutoForm.hooks({ 
    editBarsForm: { 
     before:{ 
     update: function(doc) { 
      var suburbString = AutoForm.getFieldValue("longsuburb"); 
      var postcode = suburbString.substring(suburbString.lastIndexOf(",")+2,suburbString.length); 
      var suburb = suburbString.substring(0,suburbString.indexOf(",")); 
      doc.$set.postcode = postcode; 
      doc.$set.suburb = suburb; 
      return doc; //autoForm magic commence 
      } 
     } 
    }); 
1

它看起來像doc.longsuburb是未定義的。我以前有類似的問題。你可以嘗試從this.currentDoc.longsuburb

得到longsuburb值。根據文檔: https://github.com/aldeed/meteor-autoform#callbackshooks

The following properties and functions are available in all submission hooks when they are called. This does not include formToDoc, formToModifier, or docToForm.

...

this.currentDoc: The current document attached to the form (from doc attribute)

因此,在您編輯表單JS文件,它應該是這樣的:

//Split out suburb and postcide from form's longsuburb string and submit with doc to Bars collection. 
//"suburb" currently used for filtering. 

AutoForm.hooks({ 
    editBarsForm: { 
    before:{ 
     update: function(doc) { 
       var suburbString = this.currentDoc.longsuburb; 
       var postcode = suburbString.substring(suburbString.lastIndexOf(",")+2,suburbString.length); 
       var suburb = suburbString.substring(0,suburbString.indexOf(",")); 
       doc.$set.postcode = postcode; 
       doc.$set.suburb = suburb; 
       return doc; //autoFrom magic commence 
       } 
    } 
    } 
}); 
+0

謝謝@Johnny - 改變,返回以下控制檯錯誤:'錯誤:當修飾符選項爲true時,所有驗證對象鍵必須是運算符。你忘了'$ set'?' – SLRM

+0

關注此問題[答案](http://stackoverflow.com/a/30796126/573486)我更新了使用$ set更新郵編和郊區的答案 – Johnny

+0

經過大量搜索之後,我偶然發現了這個問題。雖然這是過時的,但我想知道是否有一種方法可以使用上述方法來取消對象的設置? – blueren