Как проверить, не определено ли свойство в qml?

Ответы:

12

Пытаться: text: text ? text : "default text"

"undefined"это просто строковое представление ссылки, не ссылающейся ни на что, как Noneи NULLна других языках.

===является оператором строгого сравнения, вы можете прочитать эту тему: /programming/523643/difference-between-and-in-javascript

Kissiel
источник
Это было очень умное решение. Благодарю. Просто, чтобы объяснить кому-либо еще; это как сказать (поправьте меня, если я ошибаюсь) if (text === text) {text} else {"default text"}
Акива
2
if (text) { text } else {"default text"}если быть точным. if (object)оценивается как ложное, если objectне определено. Подобный хак в C-стиле if (указатель), который оценивается как ложный, если указатель имеет значение 0 (NULL). Стоит отметить, что textпеременная, используемая для свойства текста кнопки, берется из области видимости. Это будет намного яснее с:, text: inText ? inText : "default text"илиif(inText) { text } else {"default text"}
Kissiel
Извините за глупость, но это то, чего я никогда не понимал. В логике это технически читается так if (text is true) then {text = text} else {text = "default text"}- это точно?
Акива
2
Вы в значительной степени правы. Единственная неинтуитивная вещь в этом псевдокоде if (text is true). Мне легче думать как if (text *is*)или if (text exists). Еще один хороший источник: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Киссиэль
1
Это не удастся с text = "" (пустая строка), if вернет false
RvdK
5
import QtQuick 2.3
import QtQuick.Controls 1.2

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

Этот ответ бросает мне предупреждение.

QML Button: Binding loop detected for property "text"

Изменение textк modelTextвместо выдает ошибку.

ReferenceError: modelText is not defined

Это останавливает выполнение Javascript для меня; то есть следующая строка не называется.

Через Javascript

То же самое происходит при настройке через Javascript, но довольно многословно.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

С помощью typeof

В typeofоператорские немые ошибки и работает , как ожидалось.

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

Для сравнения с неопределенным ты пишешь text === undefined. Это будет оцениваться как ложное, если textесть null.

Если вы хотите проверить наличие значения (т. Е. Проверить оба undefinedи null), используйте его как условие в операторе if или в троичном операторе. Если вам нужно сохранить результат сравнения как логическое значение, используйте var textPresent = !!text(хотя double !может показаться запутанным при чтении кода).

TonyTony
источник