2016-08-03 7 views
2

Ich schreibe eine Tabelle Anwendung mit RiotJS und ich laufe immer wieder auf das gleiche Problem mit dem Onclick-Ereignis. Fast versuchen jedes Mal, wenn ich dieRiotJS Onclick Triggerung auf Last

<tag onclick={somefunction}>

ich sehr erratische Verhalten bekommen zu verwenden. Manchmal wird die Funktion eine ganze Reihe von Malen aufgerufen, wenn die Seite geladen oder aktualisiert wird, und reagiert dann überhaupt nicht auf Klicks. In anderen Fällen wird sie beim Start mehrmals ausgelöst. Ich kann kein Muster hinter dem Problem finden, obwohl ich bemerkt habe, dass es ein Problem mit Inline-Funktionsaufrufen, z.

<tag onclick={console.log("foo")}>

und weniger häufig mit Bezug vorbei <tag onclick={function}> obwohl es mit beiden passiert. Hat jemand so etwas erlebt? Bitte kommentieren Sie, wenn Sie mehr Kontext benötigen.

+2

Probieren Sie 'onclick = {somefunc.bind ('blah')}}' https://github.com/riot/riot/issues/1001 –

+1

Sie können nicht '{console.log (" foo ")} verwenden 'da das execute/evaluiert, während es analysiert, dann überhaupt nicht" onclick ". Wie @Daniel_L sagte, wenn Sie Argumente übergeben wollen, können Sie '.bind' oder' data-'oder ähnliches verwenden, wie in http://github.com/riot/riot/issues/1001 – user1278519

+0

erwähnt 't like: '' Verwenden Sie dann eine Closure: 'somefunction() {/ private vars */gibt function() zurück { /* Zugriff auf private vars */ /* preform your click logic */ }} so sieht Ihre Vorlage wie folgt aus: ' – Simon

Antwort

0

In Riot werden die {} Ausdrücke bei Mount/Update-Zeit ausgewertet.

Dies bedeutet, dass, wenn was innerhalb des {} ist ein Funktionsaufruf ist, es ausgeführt wird, wenn das eingehängte Tag aktualisiert wird, jedes Mal, wenn der Abschnitt in es ausgewertet wird.

Dies ist anders als Vanille Javascript, wo onclick nicht einmal geparst wird, bis das Ding angeklickt wird.

Dies kann zu einiger Verwirrung führen, weil Riot nicht immer {} Ausdrücke analysiert, wie Sie denken. Dies ist besonders problematisch, mit Verbindung Ausdrücke (die mit Booleschen Logik || und && etc.)

In diesem Fall onclick in Riot ist für einen Ausdruck/Funktion suchen ... und es wird versuchen, es in Bezug auf die bewerten Tag selbst ... in anderen Worten, dies:

<button onclick={foobar}>Click me!</button>

Riot wird versuchen this.foobar() auszuführen, wenn darauf geklickt.

Im Allgemeinen versuche ich, dies auszunutzen, indem ich meine Methoden auf diese im <script> Teil des Etiketts setze. Dies lässt sehr wenig Spielraum für Fehlinterpretationen meiner {} Ausdrücke und verschiebt die Bits der Logik aus dem HTML-Teil des Tags heraus und dorthin, wo ich das Verhalten erwarte, im Skriptabschnitt.

+0

'

  • job.Name
' Zum Beispiel. – imclean