Javascript 如何在循环中初始化qml属性列表?
我拥有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
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
}
}