Comment vérifiez-vous si une propriété n'est pas définie en qml?

14

Comment vérifiez-vous si une propriété n'est pas définie en qml?

Voici ce que j'essaie de faire:

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

Réponses:

12

Essayer: text: text ? text : "default text"

"undefined"est juste une représentation sous forme de chaîne d'une référence qui ne fait référence à rien, comme Noneou NULLdans d'autres langues.

===est un opérateur de comparaison strict, vous voudrez peut-être lire ce fil: /programming/523643/difference-between-and-in-javascript

Kissiel
la source
C'était une solution très intelligente. Merci. Juste pour expliquer à quelqu'un d'autre; c'est un peu comme dire (corrigez-moi si je me trompe) if (text === text) {text} else {"default text"}
Akiva
2
if (text) { text } else {"default text"}pour être exact. if (object)est évalué à faux si objectn'est pas défini. Piratage similaire au style C if (pointeur) qui est évalué à faux si le pointeur a une valeur de 0 (NULL). Il convient de noter que la textvariable utilisée pour la propriété de texte d'un bouton est prise hors de la portée. Ce sera beaucoup plus clair avec text: inText ? inText : "default text"if(inText) { text } else {"default text"}
:,
Désolé d'être stupide, mais c'est quelque chose que je n'ai jamais bien compris. En logique, cela se lirait techniquement comme ceci - if (text is true) then {text = text} else {text = "default text"}- est-ce exact?
Akiva
2
Vous avez à peu près raison. La seule chose peu intuitive à propos de ce pseudo-code est if (text is true). Je trouve plus facile de penser comme if (text *is*)ou if (text exists). Une autre bonne source: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kissiel
1
Cela échouera avec text = "" (chaîne vide), le if retournera false
RvdK
5
import QtQuick 2.3
import QtQuick.Controls 1.2

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

Cette réponse lance un avertissement pour moi.

QML Button: Binding loop detected for property "text"

Changer textà la modelTextplace génère une erreur.

ReferenceError: modelText is not defined

Cela arrête l'exécution de Javascript pour moi; c'est-à-dire que la ligne suivante n'est pas appelée.

Via Javascript

La même chose se produit lors de la configuration via Javascript, mais est assez verbeuse.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

En utilisant typeof

L' typeofopérateur coupe le son de l'erreur et fonctionne comme prévu.

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
la source
3

Pour comparer avec undefined vous écrivez text === undefined. Cela sera évalué à faux si textc'est le cas null.

Si vous voulez vérifier si la valeur est présente (c'est-à-dire vérifier les deux undefinedet null), utilisez-la comme condition dans l'instruction if ou l'opérateur ternaire. Si vous avez besoin de stocker le résultat de la comparaison en tant que valeur booléenne, utilisez var textPresent = !!text(même si le double !peut sembler déroutant pour celui qui lit le code).

tonytony
la source