你如何检查一个属性是否在 qml 中未定义?

Ano*_*non 15 programming application-development qml ubuntu-sdk

你如何检查一个属性是否在 qml 中未定义?

这就是我想要做的:

Button {
    id: myButton
    text: if (text === "undefined"){"default text"}
}
Run Code Online (Sandbox Code Playgroud)

Kis*_*iel 12

尝试: text: text ? text : "default text"

"undefined"只是一个引用的字符串表示,不引用任何东西,就像None, 或NULL其他语言一样。

===是严格的比较运算符,您可能需要阅读此线程:https : //stackoverflow.com/questions/523643/difference-between-and-in-javascript

  • `if (text) { text } else {"default text"}` 准确地说。如果 `object` 未定义,`if (object)` 的计算结果为 false。与 C 风格的 if(pointer) 类似的 hack,如果指针的值为 0 (NULL),则计算结果为 false。值得注意的是,用于按钮文本属性的 `text` 变量是从外部范围获取的。使用以下命令会更清楚:`text: inText ? inText : "default text"` 或 `if(inText) { text } else {"default text"}` (2认同)
  • 你说得很对。这个伪代码唯一不直观的地方是`if (text is true)`。我发现更容易思考为“if (text *is*)”或“if (text exists)”。另一个不错的来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (2认同)
  • 这将失败,并显示 text = "" (空字符串),if 将返回 false (2认同)

Mar*_*son 5

import QtQuick 2.3
import QtQuick.Controls 1.2

Button {
    id: myButton
    text: text ? text : "default text"
}
Run Code Online (Sandbox Code Playgroud)

这个答案对我发出警告。

QML Button: Binding loop detected for property "text"
Run Code Online (Sandbox Code Playgroud)

更改textmodelText,而不是抛出一个错误。

ReferenceError: modelText is not defined
Run Code Online (Sandbox Code Playgroud)

这会为我停止 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)