TypeError:无法读取属性' length'在QML数组中未定义

时间:2014-06-11 10:01:15

标签: javascript qt qml

Alias.qml

import QtQuick 2.0

Rectangle {
    width: 100
    height: 62

    property var arr : [1,2,3,4]
}

Access.qml

import QtQuick 2.0

Rectangle {
    id: newq

    width: 100
    height: 62

    property var yy : [1]
    property var pp : [1]

    onPpChanged:
    {
        console.log("\npp: " +  pp.pop())
        console.log("\nyy: " + newq.yy.length + "\n")
    }
}

main.qml

import QtQuick 2.0

Rectangle {
    id: root
    width: 360
    height: 360

    Alias
    {
        id: poi
    }

    Access
    {
        pp: poi.arr
    }
}

此行显示错误:
console.log("\nyy: " + newq.yy.length + "\n")

我哪里错了?

1 个答案:

答案 0 :(得分:2)

这是因为yy更改后pp属性尚未初始化。您可以通过更改Access.qml

来查看此内容
import QtQuick 2.0

Rectangle {
    id: newq

    width: 100
    height: 62

    property var yy : [1]
    property var pp : [1]

    onYyChanged: console.log("yy changed: " + yy)

    onPpChanged:
    {
        console.log("pp changed: " + pp)
        console.log("\nyy: " + newq.yy.length + "\n")
    }
}

输出:

  

qml:pp已更改:1,2,3,4

     

file:/// E:/Dev/Projects/qt/qml-test/Access.qml:17:TypeError:无法读取属性' length'未定义的

     

qml:yy已更改:1

您可以看到yy最终已初始化,但不会在pp之前。你应该通过if (newq.yy)检查来防范这种情况,或者如果可能的话,重构代码以避免这种情况。

不应依赖属性赋值和绑定的顺序,因为QML是一种声明性语言。

一些相关的阅读: