¿Cómo se verifica si una propiedad no está definida en qml?

Respuestas:

12

Tratar: text: text ? text : "default text"

"undefined"es solo una representación de cadena de una referencia que no hace referencia a nada, al igual que None, o NULLen otros idiomas.

===es un operador de comparación estricto, es posible que desee leer este hilo: /programming/523643/difference-between-and-in-javascript

Kissiel
fuente
Esa fue una solución muy inteligente. Gracias. Solo para explicar a alguien más; es algo así como decir (corrígeme si estoy equivocado) if (text === text) {text} else {"texto predeterminado"}
Akiva
2
if (text) { text } else {"default text"}para ser exacto. if (object)se evalúa como falso si objectno está definido. Hack similar al estilo C if (puntero) que se evalúa como falso si el puntero tiene un valor de 0 (NULL). Vale la pena señalar que la textvariable utilizada para la propiedad de texto de un botón se toma desde fuera del alcance. Será mucho más claro con: text: inText ? inText : "default text"oif(inText) { text } else {"default text"}
Kissiel
Lamento ser tonto, pero esto es algo que nunca entendí del todo. En lógica, técnicamente se leería así: if (text is true) then {text = text} else {text = "default text"}¿es esto exacto?
Akiva
2
Tienes bastante razón. Lo único poco intuitivo sobre este pseudocódigo es if (text is true). Me resulta más fácil pensar como if (text *is*)o if (text exists). Otra buena fuente: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kissiel
1
Esto fallará con text = "" (cadena vacía), el if devolverá false
RvdK
5
import QtQuick 2.3
import QtQuick.Controls 1.2

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

Esta respuesta me da una advertencia.

QML Button: Binding loop detected for property "text"

Cambiar texta en su modelTextlugar arroja un error.

ReferenceError: modelText is not defined

Esto detiene la ejecución de Javascript para mí; es decir, la siguiente línea no se llama.

Vía Javascript

Lo mismo sucede al configurarlo a través de Javascript, pero es bastante detallado.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

Utilizando typeof

El typeofoperador silencia el error y funciona como se esperaba.

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
fuente
3

Para comparar con indefinido escribes text === undefined. Esto se evaluará como falso si textes así null.

Si desea verificar si el valor está presente (es decir, verificar ambos undefinedy null), úselo como condición en la declaración if o el operador ternario. Si necesita almacenar el resultado de la comparación como un valor booleano, use var textPresent = !!text(aunque doble !puede parecer confuso para uno que lee el código).

tonytony
fuente