我想创建一个通用的事件处理程序,我可以在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个不同的模板定义,那么您仍然只需要将处理程序绑定到单个模板.