Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在循环中初始化qml属性列表?_Javascript_Qt_Qml_Qtquick2 - Fatal编程技术网

Javascript 如何在循环中初始化qml属性列表?

Javascript 如何在循环中初始化qml属性列表?,javascript,qt,qml,qtquick2,Javascript,Qt,Qml,Qtquick2,我拥有qml属性: Item { property list<SomeItem> items: [ SomeItem { num: 0 }, SomeItem { num: 1 }, SomeItem { num: 2 }, ... SomeItem { num: 100 } ] 编辑2(根据Mitch和ddriver答案): 我想使用Repeater,但是我必须初始化一些外部库提供的l

我拥有qml属性:

Item {
    property list<SomeItem> items: [
        SomeItem { num: 0 },
        SomeItem { num: 1 },
        SomeItem { num: 2 },
        ...
        SomeItem { num: 100 }
    ]
编辑2(根据Mitch和ddriver答案): 我想使用
Repeater
,但是我必须初始化一些外部库提供的list属性

我一直在用
num
属性初始化
SomeItem
,因为
key
属性必须是唯一的,不能为null。但是,假设我可以通过在
onCompleted
方法中设置
num
来解决这个问题:

Item {
    property list<SomeItem> items: [
        SomeItem { },
        SomeItem { },
        SomeItem { },
        ...
        SomeItem { }
    ]

    ...

    Component.onCompleted: {
        for(var i = 0; i < items.length; i++)
            items[i].num = i
    }
}
项目{
财产清单项目:[
SomeItem{},
SomeItem{},
SomeItem{},
...
SomeItem{}
]
...
Component.onCompleted:{
对于(变量i=0;i
所以主要的问题是我必须添加
SomeItem{},
行100次。有什么聪明的方法可以动态创建这样的属性列表吗?

没有

描述了它的使用方法:

列表值的访问方式与JavaScript数组类似:

  • 使用带有逗号分隔值的[]方括号语法指定值
  • length属性提供列表中的项目数
  • 使用[index]语法访问列表中的值
您最好使用:


你想做的事毫无意义。而且是完全多余的。而且不可能

id
属性不是字符串,也不能是数字

在您的特定情况下,您需要一个与列表中每个对象的索引相等的数字id,除了不可能之外,这也是不必要的。相反,您可以使用
items[index]
轻松访问每个对象

如果出于某种原因确实需要分配和使用动态标识符,可以使用JS对象,这将允许您执行字符串键查找,而不是整数索引:

    Item {        
        property var lookup: new Object

        Component {
            id: test

            QtObject {
                property string name
            }
        }

        Component.onCompleted: {
            lookup["John"] = test.createObject(null, { "name" : "JohnDoe" })
            lookup["Jane"] = test.createObject(null, { "name" : "JaneDoe" })

            console.log(lookup["John"].name) // outputs JohnDoe
            console.log(lookup["Jane"].name) // outputs JaneDoe
        }
    }

老实说,第一个对我来说很聪明,最接近QML的基本范式。@skypjack-它绝对不聪明,而且绝对多余。好吧,如果他关心
id
s,那确实是正确的方法。问题可能在于,他不应该为他的案件关心他们,但从这个例子来看,我不能这么说。@skypjack-不,这是错误的。从句法和概念上来说,你喜欢的,伙计。如果您有一种动态分配
id
s的方法,请回答这个问题,因为我也很好奇,我肯定会投票支持它。如果且仅当
id
s不是一个要求时,此方法才有效(当然,这在看问题时是有意义的,但问题中没有说明,可能是因为这个例子是一个简化的例子,是一个更复杂的例子,
id
s很重要)。编辑:问题刚刚更新,所以这是有意义的。
Item {
    property list<SomeItem> items: [
        SomeItem { },
        SomeItem { },
        SomeItem { },
        ...
        SomeItem { }
    ]

    ...

    Component.onCompleted: {
        for(var i = 0; i < items.length; i++)
            items[i].num = i
    }
}
Repeater {
    model: 100

    delegate: SomeItem {
        num: index
    }
}
    Item {        
        property var lookup: new Object

        Component {
            id: test

            QtObject {
                property string name
            }
        }

        Component.onCompleted: {
            lookup["John"] = test.createObject(null, { "name" : "JohnDoe" })
            lookup["Jane"] = test.createObject(null, { "name" : "JaneDoe" })

            console.log(lookup["John"].name) // outputs JohnDoe
            console.log(lookup["Jane"].name) // outputs JaneDoe
        }
    }