Voglio creare un gestore di eventi generico che posso riutilizzare su elementi dom in modo da non dover scrivere più volte la piastra della caldaia. Pensavo di aver capito, ma sto ricevendo errori.In Meteor, come posso creare un gestore di eventi generico?
Il problema che sto avendo è che penso che i gestori di eventi siano legati in un momento diverso da quello di cui ho bisogno. Forse al document.ready? Dove penso di doverli allegare con il metodo .live()? Anche se forse non ho idea di cosa sto parlando qui.
Ecco quello che sto cercando di fare:
applicazione multi pagina.
Più raccolte in cui è necessario inserire i dati.
Codice pulsante per mostrare il modulo di inserimento.
<button id="btnShowInsert" class="btn btn-success" rel="tooltip" title="add group">
<i id="btnIcon" class="icon-plus-sign icon-white"></i>
</button>
modello che mostra il modulo in base alla pagina (controllore)
{{> groups_insert}}
Qui è la forma.
<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>
Ecco il codice client per implementare il pulsante che mostra il modulo sulla pagina.
Template.groups.events[ Meteor.eventhandler.btn_events('#btnShowInsert') ] = Meteor.eventhandler.make_btn_show_insert_form_click_handler();
Ecco il mio gestore di eventi generico
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;
L'ERRORE
Uncaught TypeError: Cannot call method 'btn_events' of undefined
MA, se io definisco il gestore di eventi in questo modo e lo chiamo in questo modo funziona .
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');
}
}
}
};
Il problema Io non voglio avere a replicare il codice tutto il mio sito al fine di implementare un pulsante bello che può slideToggle e modulo a qualsiasi pagina. Se potessi ottenerlo in modo astratto, dovrei essere in grado di avere un tipo di pulsante Show Form su tutte le pagine per qualsiasi raccolta che sto rendendo disponibile per l'immissione dei dati. Inoltre, questo porta a essere in grado di creare un gestore di moduli per tutte le forme e quindi legarle al controllore attraverso un'azione al modello.
Qualche idea?
Questo funziona benissimo. Sto deprecando il mio vecchio codice. Penso che a un certo punto nel passato questo non ha funzionato con una versione anticipata di Meteor. La mia soluzione originale aveva più di un anno. –