我想創建一個通用事件處理程序,我可以在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');
}
}
}
};
的問題 我不希望有複製的代碼都在我的網站上以實現一個漂亮的按鈕,可以的slideToggle和形式的任何頁面上。如果我可以將它抽象出來,那麼我應該可以在所有我正在渲染允許數據輸入的集合的所有頁面上顯示一個Show Form類型的按鈕。同樣,這導致可以爲所有表單創建一個表單處理程序,然後通過對模型的操作將它們綁定到控制器。
任何想法?
This works great。我貶低我的舊代碼。我認爲在過去的某個時候,這不適用於流星的早期版本。我原來的解決方案已經過了一年多了。 – 2014-02-15 17:35:13