Come si controlla se una proprietà non è definita in qml?


14

Come si controlla se una proprietà non è definita in qml?

Questo è quello che sto cercando di fare:

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

Risposte:


12

Provare: text: text ? text : "default text"

"undefined"è solo una rappresentazione in forma di stringa di un riferimento che non fa riferimento a nulla, proprio Noneo NULLin altre lingue.

===è un operatore di confronto rigoroso, potresti voler leggere questa discussione: /programming/523643/difference-between-and-in-javascript


Questa è stata una soluzione molto intelligente. Grazie. Solo per spiegare a chiunque altro; è un po 'come dire (correggimi se sbaglio) if (text === text) {text} else {"default text"}
Akiva

2
if (text) { text } else {"default text"}per essere precisi. if (object)restituisce false se objectnon è definito. Hack simile a C-style if (puntatore) che restituisce false se il puntatore ha un valore pari a 0 (NULL). Vale la pena notare che la textvariabile utilizzata per la proprietà text di un pulsante viene presa dall'ambito esterno. Sarà molto più chiaro con: text: inText ? inText : "default text"oppureif(inText) { text } else {"default text"}
Kissiel,

Mi dispiace essere sciocco, ma questo è qualcosa che non ho mai capito del tutto. In logica, sarebbe tecnicamente leggere come questo - if (text is true) then {text = text} else {text = "default text"}- è esatto?
Akiva,

2
Hai praticamente ragione. L'unica cosa non intuitiva su questo pseudo-codice è if (text is true). Trovo più facile pensare come if (text *is*)o if (text exists). Un'altra buona fonte: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kissiel

1
Questo fallirà con text = "" (stringa vuota), il if restituirà false
RvdK

5
import QtQuick 2.3
import QtQuick.Controls 1.2

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

Questa risposta mi lancia un avvertimento.

QML Button: Binding loop detected for property "text"

Cambiare textper modelTextinvece genera un errore.

ReferenceError: modelText is not defined

Questo interrompe l'esecuzione di Javascript per me; cioè la linea successiva non viene chiamata.

Tramite Javascript

Lo stesso succede quando lo si imposta tramite Javascript, ma è abbastanza dettagliato.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

utilizzando typeof

L' typeofoperatore silenzia l'errore e funziona come previsto.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

3

Per confrontare con undefined scrivi text === undefined. Questo valuterà falso se lo textè null.

Se si desidera verificare se è presente un valore (ovvero, verificare sia per undefinede null), utilizzarlo come condizione in istruzione if o operatore ternario. Se è necessario memorizzare il risultato del confronto come valore booleano, utilizzare var textPresent = !!text(anche se double !potrebbe apparire confuso a chi legge il codice).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.