Estoy atascado en una función de respuesta a mensajes internos: la función email reply-sending funciona bien (si elijo manualmente en el código el campo to), pero estoy fallando, cuando elijo el mensaje para responder, para seleccionar automáticamente el correo electrónico en la colección contact-messages (campo email) con mi Meteor.methods.

En pocas palabras :

  • var to = "bob@bob.com" => ok
  • var to = this.email => ningún valor capturado

Aquí debajo de mi evento en el formulario de respuesta enviar y el método

Evento (no se puede capturar var to = this.email)

Template.ContactReplyModal.events({
    'click .send-message':function(e) {
        e.preventDefault();
        Meteor.call('replyMessage', this._id, function(error) {
            if(error) {
                Bert.alert({
                    title: 'Error',
                    message: error.reason,
                    type: 'danger'
                });
            } else {
                var to = this.email;
                var from = "my@mail.com";
                var subject = $('#reply-subject').val();
                var message = $('#reply-message').val();

                if(message != '' && subject != '') {
                    Meteor.call('sendEmailContact', to, from, subject, message, function (error) {
                        if(error) {
                            Bert.alert({
                                title: 'Error',
                                message: error.reason,
                                type: 'danger'
                            });
                        } else {
                            $('#reply-message').val('');
                            $('#reply-subject').val('');
                            Bert.alert({
                                title: 'Success',
                                message: 'Message sended.',
                                type: 'success'
                            });
                        }
                    });
                } else {
                    Bert.alert({
                        title: 'Error',
                        message: 'Message error.',
                        type: 'danger'
                    });
                }
            }
        });
    },
    //Close events for ContactReplyModal
    'click .close-login': ()=> {
        Session.set('nav-toggle-contactreply', '');
    },
    'click .modal-overlay-contactreply': ()=> {
        Session.set('nav-toggle-contactreply', '');
    }
});

Método (usando aquí la función replyMessage)

//Contact Method
Meteor.methods({
    insertMessage: function(message) {
        ContactMessages.insert(message);
    },
    openMessage: function(messageId) {
        ContactMessages.update({_id: messageId}, {$set: {new: false}});
    },
    replyMessage: function(messageId) {
        ContactMessages.findOne({_id: messageId});
    },
    deleteMessage: function(messageId) {
        ContactMessages.remove({_id: messageId});
    }
});

EDITAR

El enlace de la variable email con una función de flecha no funciona.

Entonces, ¿tal vez se trata de capturar la variable?

No puedo leer console.log (this); y console.log (this.email); dice undefined.

Aquí debajo está mi colección de mensajes.

"_id": "6c3478WugEajr6zaw",
  "name": "bob",
  "email": "bob@bob.com",
  "message": "This is a try.",
  "submitted": "2017-01-05T15:19:04.642Z",
  "new": true

Realmente no entiendo, porque este evento a continuación funciona en el método openMessage (por lo que el mensaje correcto se identifica correctamente de los demás)

//CLIENTSIDE  
  'click .open-message':function() {
            Meteor.call('openMessage', this._id, function(error) {
                if(error) {
                    Bert.alert({
                        title: 'Error',
                        message: error.reason,
                        type: 'danger'
                    });
                }
            });
        }

//SERVERSIDE

    Meteor.methods({
        insertMessage: function(message) {
            ContactMessages.insert(message);
        },
        openMessage: function(messageId) {
            ContactMessages.update({_id: messageId}, {$set: {new: false}});
        },
        replyMessage: function(message) {
            ContactMessages.findOne({_id: message});
        },
        deleteMessage: function(messageId) {
            ContactMessages.remove({_id: messageId});
        }
    });

EDITAR 2

Según lo solicitado, debajo de la plantilla y los js vinculados. El método ya se muestra y también es un ejemplo de los datos recopilados.

plantilla (contact-reply.html)

<template name="ContactReply">
    <h3>Reply</h3>
    <h3>To: {{email}}</h3>
    <input class="form-control" type="text" name="reply-subject" id="reply-subject" placeholder="Subject"/>
    <br>
    <textarea class="form-control" name="reply-message" id="reply-message" rows="6"></textarea>
    <br>
    <button class="btn btn-success send-message">Send</button>

</template>


<template name="ContactReplyModal">
    <div class="contactreply-modal {{$.Session.get 'nav-toggle-contactreply'}}">
        <i class="fa fa-close close-login"></i>
        <h3>Send a reply</h3>
        {{> ContactReply}}
    </div>
    <div class="modal-overlay-contactreply"></div>
</template>

js de la plantilla (contact-reply.js)

import './contact-reply.html';




Template.ContactReplyModal.events({
    'click .send-message':function(e) {
        e.preventDefault();
        console.log(this);
        Meteor.call('replyMessage', this._id, (error) => {
            if(error) {
                Bert.alert({
                    title: 'Error',
                    message: error.reason,
                    type: 'danger'
                });
            } else {
                console.log (this.email);
                const to = this.email;
                var from = "my@mail.com";
                var subject = $('#reply-subject').val();
                var message = $('#reply-message').val();

                if(message != '' && subject != '') {
                    Meteor.call('sendEmailContact', to, from, subject, message, (error) => {
                        if(error) {
                            Bert.alert({
                                title: 'Error',
                                message: error.reason,
                                type: 'danger'
                            });
                        } else {
                            $('#reply-message').val('');
                            $('#reply-subject').val('');
                            Bert.alert({
                                title: 'Success',
                                message: 'Message sended.',
                                type: 'success'
                            });
                        }
                    });
                } else {
                    Bert.alert({
                        title: 'Error',
                        message: 'Message error.',
                        type: 'danger'
                    });
                }
            }
        });
    },
    //Close events for ContactReplyModal
    'click .close-login': ()=> {
        Session.set('nav-toggle-contactreply', '');
    },
    'click .modal-overlay-contactreply': ()=> {
        Session.set('nav-toggle-contactreply', '');
    }
});
0
Ontokrat 5 ene. 2017 a las 15:26

2 respuestas

La mejor respuesta

Primero, es importante asegurarse de que el contexto de datos es correcto. Cada elemento dentro de la plantilla se representa con un determinado contexto de datos. Si los orienta en un controlador de eventos de plantilla, el contexto de datos estará disponible para el controlador a través de this.

Si apunta a un elemento que no está representado por la plantilla actual (por ejemplo, representado por una biblioteca de terceros o pertenece a una sub-plantilla), no tendrá un concurso de datos, que es lo que hace que su contexto de datos sea undefined).

Una vez solucionado eso, suponiendo que el contexto de datos (this) de la función externa es de hecho lo que espera en el controlador de eventos (es decir, tiene un campo email), debe ponerlo a disposición de devolución de llamada . Puede capturarlo en una variable local y ponerlo a disposición en un cierre o vincularlo léxicamente con una función de flecha :

Template.ContactReplyModal.events({
    'click .send-message':function(e) {
        e.preventDefault();
        console.log(this); // to make sure that it is what you are expecting.
        Meteor.call('replyMessage', this._id, (e) => { // note the arrow function
            if(e) {
                // ...
            } else {
                const to = this.email;
                // ...
                if(message != '' && subject != '') {
                    Meteor.call('sendEmailContact', to, from, subject, message, (e) => {
                        if(e) {
                            // ...
                        } else {
                            // ...
                        }
                    });
                } else {
                    // ...
                }
            }
        });
    },
    // ...
});

Sin embargo, no parece una buena idea usar múltiples llamadas a métodos anidados. Probablemente sería mejor hacerlo todo en una sola llamada al método.

1
MasterAM 6 ene. 2017 a las 08:44

No puede acceder a la variable de plantilla en eventos de plantilla usando esto, puede acceder a ellos por el segundo parámetro en sus eventos, aquí está su código, espero que funcione

Template.ContactReplyModal.events({
'click .send-message'(e, instance) {
e.preventDefault();
Meteor.call('replyMessage', this._id, function(error) {
    if(error) {
        Bert.alert({
            title: 'Error',
            message: error.reason,
            type: 'danger'
        });
    } else {
        var to = instance.email;
        var from = "my@mail.com";
        var subject = $('#reply-subject').val();
        var message = $('#reply-message').val();

        if(message != '' && subject != '') {
            Meteor.call('sendEmailContact', to, from, subject, message, function (error) {
                if(error) {
                    Bert.alert({
                        title: 'Error',
                        message: error.reason,
                        type: 'danger'
                    });
                } else {
                    $('#reply-message').val('');
                    $('#reply-subject').val('');
                    Bert.alert({
                        title: 'Success',
                        message: 'Message sended.',
                        type: 'success'
                    });
                }
            });
        } else {
            Bert.alert({
                title: 'Error',
                message: 'Message error.',
                type: 'danger'
            });
        }
    }
});

},});

0
Arnica 5 ene. 2017 a las 13:28