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


Ответы:


12

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

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

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


Это было очень умное решение. Благодарю. Просто, чтобы объяснить кому-либо еще; это как сказать (поправьте меня, если я ошибаюсь) 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 !может показаться запутанным при чтении кода).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.