Chcę utworzyć ogólny program obsługi zdarzeń, który będę mógł ponownie użyć na elementach dom, więc nie muszę pisać płyty kotła w kółko. Myślałem, że mam to wymyślone, ale dostaję błędy.W Meteorze, w jaki sposób mogę utworzyć ogólny program obsługi zdarzeń?
Problem polega na tym, że myślę, że programy obsługi zdarzeń są powiązane w innym czasie niż potrzebuję. Może na document.ready? Gdzie myślę, że muszę dołączyć je za pomocą metody .live()? Chociaż może nie mam pojęcia o czym tu mówię.
Oto, co próbuję zrobić:
Aplikacja wielostronicowa.
Wiele kolekcji, w których należy wstawić dane.
Kod przycisku, aby wyświetlić formularz wstawiania.
<button id="btnShowInsert" class="btn btn-success" rel="tooltip" title="add group">
<i id="btnIcon" class="icon-plus-sign icon-white"></i>
</button>
Szablon, który pokazuje formę opartą na stronie (Controller)
{{> groups_insert}}
Oto postać.
<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>
Oto kod klienta służący do implementacji przycisku wyświetlającego formularz na stronie.
Template.groups.events[ Meteor.eventhandler.btn_events('#btnShowInsert') ] = Meteor.eventhandler.make_btn_show_insert_form_click_handler();
Oto moja rodzajowy obsługi zdarzeń
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;
Błąd
Uncaught TypeError: Cannot call method 'btn_events' of undefined
ALE, gdybym definiować procedury obsługi zdarzenia w ten sposób i nazwać w ten sposób to działa .
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');
}
}
}
};
Problem nie chcę mieć do replikacji kodu całym moim miejscu w celu realizacji ładny przycisk, który można slideToggle i formę na dowolnej stronie. Gdyby udało mi się go wyodrębnić, powinienem mieć przycisk typu "Pokaż formę" na wszystkich stronach dla każdej kolekcji, którą renderuję, która pozwala na wprowadzanie danych. Co więcej, prowadzi to do możliwości utworzenia jednego formularza obsługi wszystkich formularzy, a następnie powiązania ich z kontrolerem poprzez działanie na modelu.
Wszelkie pomysły?
Działa to świetnie. Wycofuję stary kod. Myślę, że w pewnym momencie w przeszłości nie działało to z wczesną wersją Meteora. Moje oryginalne rozwiązanie miało ponad rok. –