2015-09-28 116 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