dom要素に再利用できる汎用イベントハンドラを作成したいので、何度も何度もボイラープレートを作成する必要はありません。私はそれが分かったと思ったが、間違いがある。メテオではどうすれば汎用イベントハンドラを作成できますか?
私が抱えている問題は、イベントハンドラが必要な時とは異なる時間にバインドされていると思います。多分document.readyで? .live()メソッドでそれらをアタッチする必要があると思うところは?私はここで何を言っているのか分からないかもしれませんが。ここで
は私がしようとしているものです:
マルチページアプリケーション。
データを挿入する必要のある複数のコレクション。
挿入フォームを示すボタンコード。ここで、ページ(コントローラ)
{{> groups_insert}}
に基づくフォームはフォームであることを示し
<button id="btnShowInsert" class="btn btn-success" rel="tooltip" title="add group">
<i id="btnIcon" class="icon-plus-sign icon-white"></i>
</button>
テンプレート。
<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;
は、ERROR
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タイプのボタンを持つことができます。同様に、これは、すべてのフォームのための1つのフォームハンドラを作成し、モデルへのアクションを通じてそれらをコントローラに結びつけることにつながります。
アイデア?
これは素晴らしい動作します。私は古いコードを非難しています。過去のある時点では、これはメテオの初期バージョンでは機能しませんでした。私の元々の解決策は1年以上経ちました。 –