2016-02-25 3 views
3

У меня есть форма, которую я отправляю (и используя реактивный вал для изменения вывода в представлении на submit). Всякий раз, когда я представляю успешно я получаю эту зловещую ошибку:Uncaught RangeError: Максимальный размер стека вызовов превышен. Meteor.js form

Uncaught RangeError: Maximum call stack size exceeded 
isArguments @ es5-shim.js:888 
keys @ es5-shim.js:951 
_.each._.forEach @ underscore.js:111 
EJSON.clone @ ejson.js:500 
(anonymous function) @ ejson.js:501 
_.each._.forEach @ underscore.js:113 
EJSON.clone @ ejson.js:500 
(anonymous function) @ ejson.js:501 
_.each._.forEach @ underscore.js:113 
EJSON.clone @ ejson.js:500 

У меня есть два обработчика событий в someview.js:

Template.inquiry.events({ 
    'click .submit': function(event, template) { 
    var $form = template.$('#request-form'); 

    if ($form.valid()) { 
      template.showForm.set(false); 

      Meteor.setTimeout(function() { 
      template.showForm.set(true); 
      }, 10000); // Reset after 10 seconds. 
    } 
    }, 
}); 

Template.inquiry.events({ 
    'submit form': function(event) { 
     event.preventDefault(); 
     var name = event.target.name.value; 
     var email = event.target.email.value; 

     UserList.insert({ 
      name: name, 
      email: email 
     }); 
    } 
}); 

и помощника, чтобы захватить начальную reactiveVar (ShowForm):

Template.inquiry.helpers({ 

    //toggles 'thank you' on inquiry template 
    showForm: function() { 
    return Template.instance().showForm.get(); 
    }, 
}); 

Почему я получаю эту ошибку?

ответ

1

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

Template.inquiry.events({ 
    'submit form': function(event, template) { 

    event.preventDefault(); 
    var $form = template.$('#request-form'); 

    if ($form.valid()) { 
     var name = event.target.name.value; 
     var email = event.target.email.value; 

     UserList.insert({ 
      name: name, 
      email: email 
     }); 

     template.showForm.set(false); 

     Meteor.setTimeout(function() { 
      template.showForm.set(true); 
     }, 10000); // Reset after 10 seconds. 
    } 
} 

});

и удалите click событие

+0

Спасибо. Как в стороне, нормально ли это в клиенте/views/thisview.js? Или я должен переместить эту логику в другом месте (только для лучших практик). – user1072337

+0

Я обычно помещаю все вещи, относящиеся к шаблону, в 1 файл для упрощения управления. –

+0

. Сохраняете ли вы этот файл js в той же папке, что и сам вид/шаблон? – user1072337

Смежные вопросы