我需要在另一个ListView中的ListView中插入元素(通过我的QML文件中的JS代码),但是当我尝试访问内部ListView时,我得到错误:
TypeError:无法调用方法'插入'未定义的
以下是显示我的问题的示例代码:
Item{
id:list
width: parent.width-210
height: parent.height
x:105
Component{
id:listDelegate
Item {
id:elem
height: 100
width: parent.width
Item{
id:titre_liste
height: 50
width: parent.width
Text{
anchors.left: parent.left
color:"white"
text:titre_txt
font.pixelSize: 25
font.bold: false
}
}
Item{
id:listInList
width: parent.width-100
height: parent.height
Component{
id:listInListDelegate
Item{
id:element_liste
height: parent.height
width: parent.width/5
Text{
anchors.left: parent.left
color:"white"
text:element_txt
font.pixelSize: 25
font.bold: true
}
}
}
ListView {
id: viewin
anchors.fill: parent
model: ListModel{
id:listModel_in
}
delegate: listInListDelegate
}
}
}
}
ListView {
id: viewglobal
anchors.fill: parent
model: ListModel{
id:listModel
}
delegate: listDelegate
}
}
这是我的JS代码,位于QML文件的末尾:
function addItem(){
var i;
var numListe = -1;
var liste = "titre"
var item = "item"
for(i = 0;i<listModel.count;i++)
{
if(listModel.get(i).titre_txt === liste)
{
numListe = i;
}
}
if(numListe === -1)//if the list doesn't exist
{
listModel.append({titre_txt:liste});
numListe = listModel.count-1;
}
listModel.get(numListe).listModel_in.insert(0,{element_txt:item});
}
当我尝试在内部列表中插入新元素时,错误来自JS代码的最后一行。我验证了&#34; numListe&#34;的价值。是0因此它不仅仅是错误索引的问题。
如何将元素添加到内部列表?
答案 0 :(得分:0)
该代码存在许多错误。
对于初学者来说 - 这是一个烂摊子,对于那些显然对这个东西很新的人来说这是一个非常糟糕的主意。保持清洁 - 无论您的专业水平如何,这都是一个好主意。
listModel_in
是id
,因此无法在委托组件外部访问。
然而,该对象恰好绑定到视图的model
属性,因此只要模型没有更改,您就可以通过listModel_in
属性访问model
。但是,视图本身看起来不像是委托根对象,因此您必须对其进行界面处理,例如使用alias
。
但是,外部模型中不存在内部模型,它只存在于外部模型的委托项中。
所以你不可能从listModel
得到它。您可以从viewglobal
视图中获取它,但ListView
不提供索引访问权限。因此,您必须为每个索引设置currentIndex
并使用currentItem
。
所以它看起来像这样:
viewglobal.currentItem.modelAlias.insert(0,{element_txt:item});
但不言而喻,您将数据放入GUI层,这在概念上是错误的。但它比概念错误更糟糕 - 您可能没有意识到这一点,但ListView
只创建需要显示的项目,这意味着它会根据需要创建和销毁代理。这意味着如果您的项目不在视图范围内,它将被销毁,当它返回到视图时,将创建一个新项目,并且您在旧委托项目模型中拥有的所有数据将丢失< / strong>即可。该视图永远不会存储数据,只需显示它。
内部模型应该在外部模型内部。但是,上次我检查时,QML ListModel
不支持模型嵌套,既不使用声明式语法也不使用命令式语法。如果你想嵌套模型,我提供了你可以使用的generic object model QML type。