Jak sprawdzić, czy właściwość jest niezdefiniowana w qml?

14

Jak sprawdzić, czy właściwość jest niezdefiniowana w qml?

Oto, co próbuję zrobić:

Button {
    id: myButton
    text: if (text === "undefined"){"default text"}
}
Akiva
źródło

Odpowiedzi:

12

Próbować: text: text ? text : "default text"

"undefined"jest tylko reprezentacja ciąg odniesienie nie przedstawieniu niczego, podobnie jak None, lub NULLw innych językach.

===jest ścisłym operatorem porównania, możesz przeczytać ten wątek: /programming/523643/difference-between-and-in-javascript

Kissiel
źródło
To było bardzo sprytne rozwiązanie. Dzięki. Żeby wyjaśnić komukolwiek innemu; to coś w rodzaju powiedzenia (popraw mnie, jeśli się mylę) if (text === text) {text} else {"default text"}
Akiva
2
if (text) { text } else {"default text"}byc dokładnym. if (object)zwraca wartość false, jeśli objectjest niezdefiniowany. Podobny hack do stylu C if (wskaźnik), który zwraca wartość false, jeśli wskaźnik ma wartość 0 (NULL). Warto zauważyć, że textzmienna używana do właściwości tekstu przycisku jest pobierana spoza zakresu. Będzie znacznie wyraźniej z text: inText ? inText : "default text"if(inText) { text } else {"default text"}
:,
Przepraszam, że jestem głupi, ale nigdy tego nie rozumiałem. Logicznie rzecz biorąc brzmiałoby to technicznie jako: if (text is true) then {text = text} else {text = "default text"}- czy to jest dokładne?
Akiva
2
Masz rację. Jedyną nieintuicyjną rzeczą w tym pseudokodzie jest if (text is true). Łatwiej jest mi myśleć jako if (text *is*)lub if (text exists). Kolejne dobre źródło: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kissiel
1
To się nie powiedzie z text = "" (pusty ciąg znaków), jeśli zwróci false
RvdK
5
import QtQuick 2.3
import QtQuick.Controls 1.2

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

Ta odpowiedź rzuca mi ostrzeżenie.

QML Button: Binding loop detected for property "text"

Zmiana textna modelTextzamiast powoduje błąd.

ReferenceError: modelText is not defined

To zatrzymuje dla mnie wykonanie Javascript; tzn. następna linia nie jest wywoływana.

Przez Javascript

To samo dzieje się podczas ustawiania go za pomocą Javascript, ale jest dość szczegółowe.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

Za pomocą typeof

W typeofwycisza operator błąd i działa zgodnie z oczekiwaniami.

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
źródło
3

Aby porównać z niezdefiniowanym, piszesz text === undefined. Spowoduje to ocenę na fałsz, jeśli tak textjest null.

Jeśli chcesz sprawdzić, czy wartość jest obecna (tzn. Sprawdź oba undefinedi null), użyj jej jako warunku w instrukcji if lub operatorze potrójnym. Jeśli chcesz zapisać wynik porównania jako wartość logiczną, użyj var textPresent = !!text(chociaż podwójne !może wydawać się mylące dla jednego czytającego kod).

tonytony
źródło