2015-07-06 16 views
9

Mi chiedevo se fosse possibile passare una funzione foo() come attributo func="foo()" e chiamarla this.func() all'interno dell'elemento polimerico?Passaggio di una funzione come valore di attributo

<foo-bar func="foo()"></foo-bar> 


Polymer({ 
    is: 'foo-bar', 
    properties: { 
    func: Object, 
    }, 
    ready: function() { 
    this.func(); 
    } 
}); 

Ho cercato di farlo funzionare per anni senza fortuna.

Grazie in anticipo.

+0

Quindi il tuo elemento genitore definisce la funzione 'pippo' e il tuo elemento figlio (' pippo-barra') sta cercando di chiamarlo? –

+0

@BenThomas passa semplicemente una funzione come valore di un attributo. Prendiamo semplicemente per scontato che appaia come tale nel documento HTML. In questo caso non esiste un elemento principale. –

+0

Ci sono [ulteriori risposte a questa domanda qui] (https://stackoverflow.com/q/31441401/1640892). ... https://stackoverflow.com/q/31441401/1640892 – Mowzer

risposta

2
<foo-bar func="foo()"></foo-bar> 



Polymer({ 
    is: 'foo-bar', 
    properties: { 
    func: { 
     type: String, // the function call is passed in as a string 
     notify: true 
    }, 
    attached: function() { 
    if (this.func) { 
     this.callFunc = new Function('return '+ this.func); 
     this.callFunc(); // can now be called here or elsewhere in the Polymer object 
    } 
}); 

Quindi il trucco è che "foo()" è una stringa quando la si passa per la prima volta all'elemento Polymer. Ho combattuto con questo per un po 'di tempo e questo è l'unico modo che ho potuto trovare per farlo. Questa soluzione crea una funzione che restituisce la chiamata di funzione, che viene assegnata come valore di una delle proprietà dell'elemento polimerico.

Alcune persone potrebbero dire che non si dovrebbe usare il costruttore Function perché è simile a eval() e ... beh, si sa, l'intera cosa 'eval è male'. Ma se lo stai solo usando per restituire una chiamata a un'altra funzione e capisci le implicazioni dell'ambito, penso che questo potrebbe essere un caso d'uso appropriato. Se sbaglio, sono sicuro che qualcuno ce lo faccia sapere!

Ecco un link ad un bel SO rispondere sulle differenze tra eval() e il costruttore di funzione nel caso in cui esso può aiutare: https://stackoverflow.com/a/4599946/2629361

Infine, ho messo questo nel 'allegato' evento del ciclo di vita di essere sulla lato sicuro perché si verifica dopo che 'pronto'. Non sono sicuro che potrebbe essere utilizzato un evento precedente nel ciclo di vita o "pronto" anziché "allegato". Forse qualcuno può migliorare questa risposta e farcelo sapere.

+1

Il costruttore di funzioni funziona ancora in modo simile a eval() ma in ogni caso sono quasi sicuro che il tuo suggerimento sia l'unico modo per passare una funzione come un attributo. Probabilmente ho intenzione di abbandonare questa idea a causa delle restrizioni predefinite CSP e cosa no. –

Problemi correlati