QML: Die Lambda-Funktion funktioniert unerwartet

8

Ich dachte, dass QML Lambda-Funktionen unterstützt, weil JavaScript anonyme Funktionen unterstützt und dass Funktionen zwar erstklassige Objekte sind, aber nicht so funktionieren, wie ich es erwartet habe. Nimm diesen Code:

%Vor%

Ich versuche, das Lambda function() { handler( item ); } zu verwenden, so dass, wenn das Signal someObj::someValueChanged ausgegeben wird, das emittierende Element an die Funktion handler( item ) übergeben wird.

I angenommen dass jede Schleife eine neue Instanz des Lambda erzeugen würde und dass die item Referenz die Referenz der someObj Instanz enthalten würde, die in dieser Schleife erstellt wurde (dh item würde vom Lambda erfasst werden). Aber das scheint nicht der Fall zu sein, denn die Ausgabe ist:

%Vor%

Wie Sie sehen, wird entweder die gesamte Funktion in jeder Schleife oder nur die item Referenz ersetzt, so dass letztendlich nur auf die zuletzt erstellte someObj verwiesen wird. Kann mir jemand erklären, warum Lambdas (wenn das überhaupt ist, was es ist) nicht so funktionieren, wie ich es erwarte? Und ist das ein QML-Problem oder ein allgemeines JavaScript?

    
cmannett85 06.03.2015, 12:11
quelle

1 Antwort

11

Versuchen Sie etwas wie folgt:

%Vor%

Intuitiv, oder? : D

Wenn JS "block scope" verwendet, würden 3 verschiedene item s für jede Schleifeniteration referenziert werden, und es würde "wie erwartet funktionieren". Aber mit "Funktionsumfang" wird nur ein item referenziert, und es verweist auf seinen endgültigen Wert, daher muss dieser Hack verwendet werden, um jeden Wert in der Zeit zu erfassen.

    
dtech 06.03.2015, 14:23
quelle

Tags und Links