QML条件绑定不按预期工作

cma*_*t85 7 qt qml

如果我有一个简单Binding的形式对象:

Rectangle {
    height: 400
    width: 500

    property var someObj: null

    Binding on color {
        when:  someObj
        value: someObj.color
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我希望的是,当someObjnull,someObjcolor属性绑定到该对象的color属性.我实际得到的是运行时错误消息:

TypeError: Cannot read property 'color' of null
Run Code Online (Sandbox Code Playgroud)

这有什么原因不起作用?

几乎等效的JavaScript表达式:

color: {
    if ( someObj != null ) {
        return someObj.color;
    } else {
        return "black";
    }
}
Run Code Online (Sandbox Code Playgroud)

按预期工作.

Ans*_*mar 0

QML语法定义属性值初始化赋值右侧的花括号表示绑定赋值。在初始化var属性时,这可能会令人困惑,因为 JavaScript 中的空花括号可以表示表达式块或空对象声明。如果您希望将var属性初始化为空对象值,则应将花括号括在括号中

例如:

Item {
    property var first:  {}   // nothing = undefined
    property var second: {{}} // empty expression block = undefined
    property var third:  ({}) // empty object
}
Run Code Online (Sandbox Code Playgroud)

在前面的示例中,第一个属性绑定到一个空表达式,其结果为undefined。第二个属性绑定到一个包含单个空表达式块的表达式("{}"),该表达式块同样具有undefined结果。第三个属性绑定到一个被计算为空对象声明的表达式,因此该属性将使用该空对象值进行初始化。

同样,JavaScript 中的冒号可以是对象属性值分配,也可以是代码标签。因此,使用对象声明初始化var属性也可能需要括号:

Item {
    property var first: { example: 'true' }    // example is interpreted as a label
    property var second: ({ example: 'true' }) // example is interpreted as a property
    property var third: { 'example': 'true' }  // example is interpreted as a property
    Component.onCompleted: {
        console.log(first.example) // prints 'undefined', as "first" was assigned a string
        console.log(second.example) // prints 'true'
        console.log(third.example) // prints 'true'
    }
}
Run Code Online (Sandbox Code Playgroud)

所以代码应该如下:

Rectangle {
    height: 400
    width: 500

    property var someObj: ({color: ''})

    Binding on color {
        when: someObj.color
        value: someObj.color
    }
}
Run Code Online (Sandbox Code Playgroud)