2015-07-06 19 views
9

Zastanawiałem się, czy można przekazać funkcję foo() jako atrybut func="foo()" i czy jest ona nazywana this.func() wewnątrz elementu polimerowego?Przekazywanie funkcji jako wartości atrybutu

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


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

Starałem się, aby to działało przez wieki bez powodzenia.

Z góry dziękuję.

+0

Twój rodzicielski element definiuje funkcję 'foo' i twój element podrzędny (' foo-bar') próbuje ją wywołać? –

+0

@BenThomas przekazuje tylko funkcję jako wartość atrybutu. Przyjmiemy po prostu dla prostoty, że pojawia się w dokumentach HTML. W tym przypadku nie ma elementu rodzica. –

+0

Istnieje [więcej odpowiedzi na to pytanie tutaj] (https://stackoverflow.com/q/31441401/1640892). ... https://stackoverflow.com/q/31441401/1640892 – Mowzer

Odpowiedz

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 
    } 
}); 

Sztuczka polega na tym, że "foo()" jest ciągiem, gdy najpierw przekazujesz go do elementu Polymer. Walczyłem z tym przez jakiś czas i jest to jedyny sposób, jaki mogłem znaleźć, aby to zrobić. To rozwiązanie tworzy funkcję, która zwraca twoje wywołanie funkcji, które przypisujesz jako wartość jednej z własności twojego polimeru.

Niektórzy ludzie mogą powiedzieć, że nie powinieneś używać konstruktora Function, ponieważ jest podobny do eval() i ... no cóż, wiesz, cała sprawa "eval is evil". Ale jeśli po prostu używasz go, aby oddzwonić do innej funkcji i rozumiesz znaczenie tego zakresu, myślę, że to może być odpowiedni przypadek użycia. Jeśli się mylę, na pewno ktoś nas o tym powiadomi!

Oto link do miłym SO odpowiedzieć na temat różnic między eval() i konstruktora funkcji w przypadku może pomóc: https://stackoverflow.com/a/4599946/2629361

Wreszcie kładę to w „dołączonym” imprezy cyklem życia być na bezpieczna strona, ponieważ występuje później niż "gotowa". Nie jestem pewien, czy można użyć wcześniejszego cyklu życia lub "gotowego" zamiast "załączonego". Być może ktoś może poprawić tę odpowiedź i dać nam znać.

+1

Konstruktor funkcji nadal działa bardzo podobnie do eval(), ale nigdy mniej, jestem pewien, że twoja sugestia to jedyny sposób na przekazanie funkcji jako atrybut. Prawdopodobnie porzucę ten pomysł ze względu na domyślne ograniczenia CSP, a co nie. –

Powiązane problemy