Bagaimana Anda memeriksa apakah sebuah properti tidak terdefinisi dalam qml?

14

Bagaimana Anda memeriksa apakah sebuah properti tidak terdefinisi dalam qml?

Inilah yang saya coba lakukan:

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

Jawaban:

12

Mencoba: text: text ? text : "default text"

"undefined"hanyalah representasi string dari referensi yang tidak merujuk apa pun, seperti None, atau NULLdalam bahasa lain.

===adalah operator perbandingan yang ketat, Anda mungkin ingin membaca utas ini: /programming/523643/difference-between-and-in-javascript

Kissiel
sumber
Itu adalah solusi yang sangat cerdas. Terima kasih. Hanya untuk menjelaskan kepada orang lain; itu seperti mengatakan (koreksi saya jika saya salah) jika (teks === teks) {teks} else {"teks default"}
Akiva
2
if (text) { text } else {"default text"}tepatnya. if (object)bernilai false jika objecttidak terdefinisi. Mirip hack untuk C-style if (pointer) yang mengevaluasi false jika pointer memiliki nilai 0 (NULL). Perlu dicatat bahwa textvariabel yang digunakan untuk properti teks tombol diambil dari luar lingkup. Ini akan menjadi lebih jelas dengan text: inText ? inText : "default text"if(inText) { text } else {"default text"}
:,
Maaf sudah gila, tapi ini adalah sesuatu yang aku tidak pernah mengerti. Dalam logika, secara teknis akan dibaca sebagai ini - if (text is true) then {text = text} else {text = "default text"}- apakah ini akurat?
Akiva
2
Anda benar sekali. Satu-satunya hal yang tidak intuitif tentang kode semu ini adalah if (text is true). Saya merasa lebih mudah untuk berpikir sebagai if (text *is*)atau if (text exists). Sumber lain yang bagus: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kissiel
1
Ini akan gagal dengan text = "" (string kosong), if akan mengembalikan false
RvdK
5
import QtQuick 2.3
import QtQuick.Controls 1.2

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

Jawaban ini memberi peringatan bagi saya.

QML Button: Binding loop detected for property "text"

Mengubah textke modelTextgantinya melempar kesalahan.

ReferenceError: modelText is not defined

Ini menghentikan eksekusi Javascript untuk saya; yaitu baris berikutnya tidak dipanggil.

Melalui Javascript

Hal yang sama terjadi ketika mengaturnya melalui Javascript, tetapi cukup verbose.

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: "default text"

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

Menggunakan typeof

The typeofbisu operator kesalahan dan bekerja seperti yang diharapkan.

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

Untuk membandingkan dengan undefined yang Anda tulis text === undefined. Ini akan bernilai false jika textada null.

Jika Anda ingin memeriksa apakah nilainya ada (yaitu, periksa keduanya undefineddan null), gunakan itu sebagai ketentuan dalam pernyataan if atau operator ternary. Jika Anda perlu menyimpan hasil perbandingan sebagai nilai boolean, gunakan var textPresent = !!text(meskipun ganda !mungkin tampak membingungkan untuk satu yang membaca kode).

tonytony
sumber