ボイラー プレートを何度も記述する必要がないように、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;
エラー
キャッチされていない TypeError: 未定義のメソッド '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
抽象化できれば、データ入力を許可するレンダリング中のコレクションのすべてのページにフォームの表示タイプのボタンを配置できるはずです。同様に、これにより、すべてのフォームに対して 1 つのフォーム ハンドラーを作成し、モデルへのアクションを介してそれらをコントローラーに結び付けることができます。
何か案は?