javascript – 在Meteor中如何创建通用事件处理程序?

前端之家收集整理的这篇文章主要介绍了javascript – 在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; //,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','alert-error');
      }
    }
  }
};

问题
我不想在我的网站上复制代码,以便实现一个可以在任何页面上滑动切换和表单的漂亮按钮.如果我可以将其抽象化,那么我应该可以在所有页面上为我正在渲染的任何允许数据输入的集合设置一个Show Form类型的按钮.同样,这导致能够为所有表单创建一个表单处理程序,然后通过对模型的操作将它们绑定到控制器.

有任何想法吗?

解决方法

您可以将高级模板绑定到使用子模板创建的元素.然后你只需要做一次绑定.例如

HTML:

<template name="settings">
    {{> login_settings }}
    {{> account_settings }}
    {{> data_settings }}
</template>

<template name="login_settings">
  <btn class="slideToggle">Slide me for login!</btn>
</template>

<template name="account_settings">
  <btn class="slideToggle">Slide me for account!</btn>
</template>

<template name="data_settings">
  <btn class="slideToggle">Slide me for data!</btn>
</template>

JavaScript的:

Template.settings.events {
  'click .slideToggle': function() {
    var clickedElement = event.target;
    // add/remove CSS classes to clicked element
  }
};

因此,如果最终在设置下创建10个不同的模板定义,那么您仍然只需要将处理程序绑定到单个模板.

猜你在找的JavaScript相关文章