2015-09-28 1 views
2

Я использую большой пакет aldeed: autoform для MeteorJS. У меня есть пользовательская форма, которая позволяет мне создавать записи db.MeteorJS AutoForm.Hooks не обновляет doc

Одно из введенных пользователем полей формы для Suburb, и я использую пакет sergeyt: typeahead, чтобы вносить предложения по этому типу пользователя.

Предложения в формате, который знаком пользователям (по существу, это «пригород, ГОСУДАРСТВЕННЫЙ, почтовый индекс»). Я называю это longsuburb.

Я использую AutoForm перед подключением, чтобы разделить значение Zipcode («почтовый индекс») и значение «пригород» от выбранного пользователем/введенного значения longsuburb. Крючок затем вставляет значения пригорода и почтового индекса в документ до его отправки.

Все это отлично работает.

Теперь я хочу создать форму редактирования, в которой пользователь может редактировать детали (по линии я планирую использовать ту же форму для обоих, но для меня это один шаг за раз, поскольку я новичок).

Я создал шаблон формы редактирования и установил тип «обновление» в соответствии с примерами AutoForm.

Я могу успешно редактировать все детали формы, и они сохраняются в коллекции, за исключением того, что мой крюк AutoForm, похоже, вообще не вызван, поэтому значения «пригород» и «почтовый индекс» для документа остаются такой же на submit.

Я пробовал несколько разных подходов, но в основном снимаю в темноте, поэтому любой совет будет замечательным.

Вот шаблону формы редактирования

<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'); 
    } 
}); 

шаблон, добавить и код в основном одинаковы. Как я уже сказал, все хорошо работает для создания записи. Я также могу редактировать имя, url, longsuburb и т. Д., И они сохраняются в БД. Это только вкладка doc, которая не работает.

+0

Я обновил крюк в JS из «вставки» к «обновлению», и я получаю следующее сообщение об ошибке в консоли браузера: '[Error] Ошибка типа: undefined не является объектом (оценка «suburbString.substring») ' – SLRM

ответ

3

Спасибо @Джонни. То, что почти сделал трюк, но с вашей помощью я смог его решить.

В основном у меня было две проблемы. Как вы указали, мне действительно нужно использовать doc. $ Set.key для обновления значений почтового индекса и пригорода. Но мне также нужно было определить переменную suburbString, используя обратный вызов AutoForm.getFieldValue.

Так полное решение выглядит следующим образом:

//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 не определено. Раньше у меня была аналогичная проблема. Вы можете попытаться получить значение longsuburb от this.currentDoc.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 - изменение, которое возвращает следующую консольную ошибку:' Ошибка: если опция модификатора истинна, все ключи объекта проверки должны быть операторами. Вы забыли '$ set'?' – SLRM

+0

После этого [ответ] (http://stackoverflow.com/a/30796126/573486) я обновил ответ, чтобы использовать $ set для обновления почтового индекса и пригорода – Johnny

+0

После многого поиска, Я наткнулся на этот вопрос. Хотя это датировано, я хотел бы знать, есть ли способ отменить объект, используя указанную выше методологию? – blueren