Pertanyaan Bagaimana Anda memeriksa apakah properti tidak terdefinisi dalam qml?


Bagaimana Anda memeriksa apakah properti tidak terdefinisi dalam qml?

Inilah yang saya coba lakukan:

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

11
2017-09-24 07:57


asal




Jawaban:


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

"undefined" hanyalah representasi string referensi yang tidak mereferensikan apa pun, sama seperti None, atau NULL dalam bahasa lain.

=== adalah operator perbandingan ketat, Anda mungkin ingin membaca utas ini: https://stackoverflow.com/questions/523643/difference-between-and-in-javascript


10
2017-09-24 13:37



Itu adalah solusi yang sangat pintar. Terima kasih. Hanya untuk menjelaskan kepada orang lain; semacam ucapan seperti (benar saya jika saya salah) jika (teks === teks) {text} else {"teks default"} - Akiva
if (text) { text } else {"default text"} tepatnya. if (object) mengevaluasi ke false jika object tidak terdefinisi. Serupa ke C-gaya jika (pointer) yang mengevaluasi ke false jika pointer memiliki nilai 0 (NULL). Ini perlu diperhatikan text variabel yang digunakan untuk properti teks tombol diambil dari luar lingkup. Ini akan menjadi lebih jelas dengan: text: inText ? inText : "default text", atau if(inText) { text } else {"default text"} - Kissiel
Maaf menjadi bodoh, tapi ini adalah sesuatu yang tidak pernah saya mengerti. Dalam logika, secara teknis akan dibaca seperti ini - if (text is true) then {text = text} else {text = "default text"} - Apakah ini akurat? - Akiva
Anda cukup banyak benar. Satu-satunya hal yang tidak intuitif tentang pseudo-code ini if (text is true). Saya merasa lebih mudah untuk berpikir seperti itu if (text *is*) atau if (text exists). Sumber bagus lain: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Kissiel
Ini akan gagal dengan text = "" (string kosong), jika akan mengembalikan false - RvdK


import QtQuick 2.3
import QtQuick.Controls 1.2

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

Jawaban ini memberi peringatan untuk saya.

QML Button: Binding loop detected for property "text"

Berubah text untuk modelText malah melempar kesalahan.

ReferenceError: modelText is not defined

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

Via 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

Itu typeof operator mematikan 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;
        }
    }
}

4
2017-11-22 15:24





Untuk membandingkan dengan Anda menulis tidak terdefinisi text === undefined. Ini akan dinilai salah jika text aku s null.

Jika Anda ingin memeriksa apakah nilai ada (yaitu, periksa keduanya undefined dan null), gunakan sebagai kondisi jika pernyataan atau operator terner. Jika Anda perlu menyimpan hasil perbandingan sebagai nilai boolean, gunakan var textPresent = !!text (meskipun dua kali lipat ! mungkin tampak membingungkan bagi seseorang yang membaca kode).


1
2017-11-29 10:26