Quiero crear un controlador genérico de eventos que pueda reutilizar en elementos dom para que no tenga que escribir la placa de la caldera una y otra vez. Pensé que lo había resuelto, pero estoy recibiendo errores.En Meteor, ¿cómo puedo crear un controlador de eventos genérico?
El problema que tengo es que creo que los controladores de eventos están vinculados en un momento diferente al que necesito. Tal vez en document.ready? Donde creo que necesito adjuntarlos con el método .live()? Aunque no tengo idea de lo que estoy hablando aquí.
Aquí es lo que estoy tratando de hacer:
aplicación de varias páginas.
Colecciones múltiples donde se deben insertar datos.
Código de botón para mostrar el formulario de inserción.
Plantilla<button id="btnShowInsert" class="btn btn-success" rel="tooltip" title="add group">
<i id="btnIcon" class="icon-plus-sign icon-white"></i>
</button>
que muestra el formulario basado en la página (controlador)
{{> groups_insert}}
Aquí es 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>
Aquí está el código del cliente para implementar el botón que muestra el formulario en la página.
Template.groups.events[ Meteor.eventhandler.btn_events('#btnShowInsert') ] = Meteor.eventhandler.make_btn_show_insert_form_click_handler();
Aquí es mi genérico controlador de eventos
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;
EL ERROR
Uncaught TypeError: Cannot call method 'btn_events' of undefined
PERO, si defino el controlador de eventos de esta manera y lo llaman de esta manera es que funciona .
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');
}
}
}
};
El problema yo no quiero tener que replicar código por todo el sitio con el fin de implementar un buen botón que puede slideToggle y la forma en cualquier página. Si pudiera abstraerlo, debería poder tener un tipo de botón Mostrar formulario en todas las páginas para cualquier colección que esté procesando y que permita la entrada de datos. Además, esto permite crear un manejador de formulario para todas las formas y luego vincularlas al controlador a través de una acción para el modelo.
¿Alguna idea?
Esto funciona genial. Estoy desaprobando mi código anterior. Creo que en algún momento del pasado esto no funcionó con una versión anterior de Meteor. Mi solución original tenía más de un año. –