2015-01-15 15 views
5

In Meteor, sto inviando due oggetti dal mio db a un modello:Accesso dizionario template aiuto nella gestore di eventi Meteor

Template.myTemplate.helpers({ 
    helper1: function() { 
    var object1 = this; // data context set in iron:router...path is context dependent 
    // modify some values in object1 
    return this; 
    }, 
    helper2: function() { 
    return Collection2.find({_id: this.object2_id}); 
    } 
}); 

Questo modello ha anche un gestore di eventi di modificare i due oggetti sopra. Sto cercando di accedere a helper1 e helper2 dall'alto, ma se chiamo il contesto dei dati del modello, ottengo solo l'accesso alla versione non modificata di object1. Come posso accedere agli helper definiti sopra?

Template.myTemplate.events({ 
    'submit form': function(event) { 
    event.preventDefault(); 
    // Access helper2 object and attributes here instead of calling Collection2.find() again 
    } 
}); 
+2

non c'è modo di chiamare aiutanti con l'API pubblica corrente. –

+1

Peppe, potresti saperlo, ma ho appena scoperto che esiste una API interna per accedere agli helper: Template.myTemplate .__ helpers.get ('helper'); – bgmaster

+0

Dato che questo è interno, presumo che l'API possa cambiare in futuro, quindi potrebbe non essere la migliore idea per usarlo spesso nel codice. – bgmaster

risposta

4

aiutanti sono solo le funzioni e quindi possono essere passati in giro e assegnati ad altre variabili a volontà, così si potrebbe definire una funzione e quindi assegnare la chiave helper2 degli aiutanti modello e chiamare da esso è riferimento originario dalla gestore di eventi.

var helperFunction = function() { 
    return Collection2.find({_id: this.object2_id}); 
}; 

Template.myTemplate.helpers({ 
    helper1: function() { 
     var object1 = this; // data context set in iron:router...path is context dependent 
     // modify some values in object1 
     return this; 
    }, 
    helper2: helperFunction 
}); 

Template.myTemplate.events({ 
    'submit form': function(event) { 
     event.preventDefault(); 
     var cursor = helperFunction(); 
    } 
}); 
+0

Grazie. Questo modello aiuta un po 'a evitare il codice ripetuto, che volevo fare. L'unica cosa che noterei è che questa funzione può cambiare. Quando si chiama la funzione nel gestore eventi, questo diventa l'oggetto Finestra anziché il contesto dati. Trovo strano questo considerando che nel gestore di eventi è ancora il contesto dei dati. Se puoi aggiornare la tua risposta per riflettere questo, la contrassegnerò come corretta. – bgmaster

+0

Come ha notato @bgmaster, è necessario chiamare [il metodo di chiamata] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call) e fornire il 'thisArg 'invece di chiamare semplicemente la funzione. Tuttavia, nel caso, non si sa cosa dovrebbe essere il 'thisArg' (e potrebbe essere diverso tempi diversi' {{helper2}} 'è stato usato, quindi questo non funziona in generale). –

0

Se è possibile modificare aiutanti da eventi, quindi, qualsiasi parte dell'applicazione Meteor può fare, che è contro la filosofia progettuale di Blaze!

Blaze è progettato per essere un sistema allettante per legare i dati. Quello che chiedi può essere ottenuto usando Angular (usato da solo o affiancato a Blaze, guarda a THIS), che è per sua natura un sistema di allettamento bidirezionale dei dati.

Si consiglia inoltre di controllare Reagire, che è anche un dato 2 modo vincolante

Problemi correlati