Wie prüft man, ob eine Eigenschaft in qml undefiniert ist?

14

Wie prüft man, ob eine Eigenschaft in qml undefiniert ist?

Das versuche ich zu tun:

Button {
    id: myButton
    text: if (text === "undefined"){"default text"}
}
Akiva
quelle

Antworten:

12

Versuchen: text: text ? text : "default text"

"undefined"ist nur eine Zeichenfolgendarstellung einer Referenz, die nichts genau wie Noneoder NULLin anderen Sprachen referenziert .

===Wenn es sich um einen strengen Vergleichsoperator handelt, möchten Sie möglicherweise diesen Thread lesen: /programming/523643/difference-between-and-in-javascript

Kissiel
quelle
Das war eine sehr clevere Lösung. Vielen Dank. Nur um es jemand anderem zu erklären; Es ist so, als würde man sagen (korrigiere mich, wenn ich falsch liege), wenn (text === text) {text} else {"default text"}
Akiva
2
if (text) { text } else {"default text"}um genau zu sein. if (object)wird zu false ausgewertet, wenn objectundefiniert ist. Ähnliches Hacking wie C-style if (Zeiger), das false ergibt, wenn der Zeiger den Wert 0 (NULL) hat. Es ist erwähnenswert, dass textdie für die Texteigenschaft einer Schaltfläche verwendete Variable außerhalb des Gültigkeitsbereichs liegt. Es wird viel klarer mit: text: inText ? inText : "default text"oderif(inText) { text } else {"default text"}
Kissiel
Es tut mir leid, dumm zu sein, aber das habe ich nie ganz verstanden. In der Logik würde es technisch so lauten - if (text is true) then {text = text} else {text = "default text"}- ist das korrekt?
Akiva
2
Du hast so ziemlich recht. Das einzig Unintuitive an diesem Pseudocode ist if (text is true). Ich finde es einfacher, als if (text *is*)oder zu denken if (text exists). Eine weitere gute Quelle: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kissiel
1
Dies wird mit text = "" (leere Zeichenfolge) fehlschlagen, das if wird false zurückgeben
RvdK
5
import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: text ? text : "default text"
}

Diese Antwort warnt mich.

QML Button: Binding loop detected for property "text"

Das Ändern textauf löst modelTextstattdessen einen Fehler aus.

ReferenceError: modelText is not defined

Dies stoppt die Ausführung von Javascript für mich; dh die nächste Zeile wird nicht aufgerufen.

Über Javascript

Das gleiche passiert, wenn es über Javascript eingestellt wird, ist aber ziemlich ausführlich.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

    Component.onCompleted: {
        if (modelText !== "undefined") {
            myButton.text = modelText;
        }
    }
}

Verwenden typeof

Der typeofBediener schaltet den Fehler stumm und arbeitet wie erwartet.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

    Component.onCompleted: {
        if (typeof modelText !== "undefined") {
            myButton.text = modelText;
        }
    }
}
Marcus Ottosson
quelle
3

Zum Vergleich mit undefined schreibst du text === undefined. Dies wird zu false ausgewertet, wenn textist null.

Wenn Sie überprüfen möchten, ob ein Wert vorhanden ist (dh, ob beide undefinedund vorhanden sind null), verwenden Sie ihn als Bedingung in der if-Anweisung oder im ternären Operator. Wenn Sie das Ergebnis des Vergleichs als booleschen Wert speichern müssen, verwenden Sie var textPresent = !!text(obwohl double !möglicherweise verwirrend erscheint, wenn Sie den Code lesen).

Tonytony
quelle