Как в Meteor создать универсальный обработчик событий?

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

Проблема, с которой я сталкиваюсь, заключается в том, что я думаю, что обработчики событий связаны в другое время, чем мне нужно. Может быть, в document.ready? Где, я думаю, мне нужно их прикрепить методом.live ()? Хотя, возможно, я понятия не имею, о чем я здесь говорю.

Вот что я пытаюсь сделать:

Многостраничное приложение.

Несколько коллекций, в которые необходимо вставить данные.

Код кнопки для отображения формы вставки.

<button id="btnShowInsert" class="btn btn-success" rel="tooltip" title="add group">
    <i id="btnIcon" class="icon-plus-sign icon-white"></i>
</button>

Шаблон, показывающий форму на основе страницы (контроллера)

{{> groups_insert}}

Вот форма.

<template name="groups_insert">
    {{#if acl_check}}
    {{> alert}}
    < p>
      < form class="form-horizontal well hide" id="insert">
        <fieldset>
          < div class="control-group">
            < label class="control-label" for="name">Name</label>
            < div class="controls">
              < input type="text" class="input-xlarge" id="name" name="name">
            < /div>
          < /div>
          < div class="form-actions well">
            < button id="btnReset" type="reset" class="btn btn-large">Reset</button>
            < button id="btnSubmit" type="button" class="btn btn-primary btn-large">Submit</button>
          < /div>
        < /fieldset>
      < /form>
    < /p>
  {{/if}}
< /template>

Вот клиентский код для реализации кнопки, отображающей форму на странице.

Template.groups.events[ Meteor.eventhandler.btn_events('#btnShowInsert') ] =  Meteor.eventhandler.make_btn_show_insert_form_click_handler();

Вот мой общий обработчик событий

var EventHandler = Base.extend({
  btn_events: function(selector) {
    return 'click ' + selector; //, keydown '+selector+', focusout '+selector;
  },

  make_btn_show_insert_form_click_handler: function(){
    //var click = options.click || function () {};
    return function (event) {
      if (event.type === "click") {
        event.stopPropagation();
        event.preventDefault;
        try{
          if ($('#btnIcon').hasClass('icon-plus-sign') ) {
            $('#btnIcon').removeClass('icon-plus-sign');
            $('#btnIcon').addClass('icon-minus-sign');
          } else {
            $('#btnIcon').removeClass('icon-minus-sign');
            $('#btnIcon').addClass('icon-plus-sign');
          }

          $('#insert').slideToggle('slow', 'swing');

        } catch(error) {
          Alert.setAlert('Error', 'Critical Error: ' + error, 'alert-error');
        }
      }
    }
  },

});

Meteor.eventhandler = new EventHandler;

ОШИБКА

Uncaught TypeError: Cannot call method 'btn_events' of undefined

НО , если я определяю обработчик событий таким образом и вызываю его таким образом, он работает.

Template.groups.events[ btn_events('#btnShowInsert') ] =  make_btn_show_insert_form_click_handler();

var btn_events = function (selector) {
  return 'click ' + selector; //, keydown '+selector+', focusout '+selector;
};


var make_btn_show_insert_form_click_handler = 
function () {
  //var click = options.click || function () {};
  console.log( Meteor.request.controller );

  return function (event) {
    if (event.type === "click") {
      event.stopPropagation();
      event.preventDefault;
      try{
        if ($('#btnIcon').hasClass('icon-plus-sign') ) {
          $('#btnIcon').removeClass('icon-plus-sign');
          $('#btnIcon').addClass('icon-minus-sign');
        } else {
          $('#btnIcon').removeClass('icon-minus-sign');
          $('#btnIcon').addClass('icon-plus-sign');
        }

        $('#insert').slideToggle('slow', 'swing');

      } catch(error) {
        Alert.setAlert('Error', 'Critical Error: ' + error, 'alert-error');
      }
    }
  }
};

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

Любые идеи?

6
задан Bobrovsky 21 November 2012 в 07:12
поделиться