Como você verifica se uma propriedade está indefinida no qml?

14

Como você verifica se uma propriedade está indefinida no qml?

Isto é o que estou tentando fazer:

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

Respostas:

12

Experimentar: text: text ? text : "default text"

"undefined"é apenas uma representação em cadeia de uma referência não fazer referência a qualquer coisa, assim como None, ou NULLem outras línguas.

===é um operador de comparação estrita, convém ler este tópico: /programming/523643/difference-between-and-in-javascript

Kissiel
fonte
Essa foi uma solução muito inteligente. Obrigado. Apenas para explicar a mais alguém; a sua sorte como dizendo (me corrija se eu estiver errado) if (texto === texto) {text} else { "texto padrão"}
Akiva
2
if (text) { text } else {"default text"}para ser exato. if (object)avalia como false se não objectfor definido. Corte semelhante ao estilo C se (ponteiro) que é avaliado como falso se o ponteiro tiver um valor 0 (NULL). Vale ressaltar que a textvariável usada para a propriedade de texto de um botão é retirada do escopo externo. Será muito mais claro com text: inText ? inText : "default text"if(inText) { text } else {"default text"}
:,
Desculpe ser idiota, mas isso é algo que eu nunca entendi direito. Na lógica, seria tecnicamente lido como este - if (text is true) then {text = text} else {text = "default text"}- isso é preciso?
Akiva
2
Você está certa. A única coisa não intuitiva sobre esse pseudocódigo é if (text is true). Acho mais fácil pensar como if (text *is*)ou if (text exists). Outra boa fonte: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kissiel
1
Isso falhará com text = "" (string vazia), o if retornará false
RvdK 16/16/16
5
import QtQuick 2.3
import QtQuick.Controls 1.2

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

Esta resposta lança um aviso para mim.

QML Button: Binding loop detected for property "text"

Mudar textpara em modelTextvez disso gera um erro.

ReferenceError: modelText is not defined

Isso interrompe a execução do Javascript para mim; ou seja, a próxima linha não é chamada.

Via Javascript

O mesmo acontece ao defini-lo via Javascript, mas é bastante detalhado.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

Usando typeof

O typeofoperador silencia o erro e funciona conforme o esperado.

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

Para comparar com indefinido, você escreve text === undefined. Isso será avaliado como falso se textfor null.

Se você deseja verificar se o valor está presente (ou seja, verifique os dois undefinede null), use-o como condição na instrução if ou no operador ternário. Se você precisar armazenar o resultado da comparação como um valor booleano, use var textPresent = !!text(embora o dobro !possa parecer confuso para quem lê o código).

tonytony
fonte