我想创建一个可以在 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;
错误
未捕获的类型错误:无法调用未定义的方法“btn_events”
但是,如果我以这种方式定义事件处理程序并以这种方式调用它,它就可以工作。
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');
}
}
}
};
问题
我不想为了实现一个可以slideToggle
在任何页面上形成的漂亮按钮而在我的网站上复制代码。如果我能把它抽象出来,那么我应该能够在所有页面上为我正在呈现的任何允许数据输入的集合提供一个显示表单类型的按钮。同样,这也导致能够为所有表单创建一个表单处理程序,然后通过对模型的操作将它们绑定到控制器。
有任何想法吗?