2

我正在创建一个listView我的委托及其信息来自 JSON 的地方 - 我的问题是我试图从 JSON 中section.property的嵌套区域设置。嵌套数据将是动态的,因此我需要以适应每个应用程序用户的方式工作。

我正在使用的文档是: JsonListModel & SortFilterProxyModel

我的 JSON 的一个例子是;

[{
"firstname":"Edward",
"subGroup":"Reception",
"admin":1,
"roles":
    {"Assistant":0,"Reception":1,"Stylist":1,"Technical":0
    }
},
{
"firstname":"Claire",
"subGroup":"Stylist",
"admin":1,
"roles":
    {"Assistant":1,"Reception":0,"Stylist":1,"Technical":0
    }
}]

我正在通过使用JsonListModelQT Creator 工作,我的代码的最小部分如下:

import Felgo 3.0
import QtQuick 2.0

Page {
id: editAdmins


property var newArr: dataModel.calendarUserItems.users
property var userRoles: ({})
property var l

JsonListModel { // list model for json data
    id: jsonModel
    source: dataModel.jsonList // my full JSON
    keyField: "firstname " + " surname" 
    fields: ["firstname", "surname", "subGroup", "admin", "email", "roles"]
}

SortFilterProxyModel { // SortFilterProxyModel for sorting or filtering lists
    id: sortedModel
   // Note: when using JsonListModel, the sorters or filter might not be applied correctly when directly assigning sourceModel
   // use the Component.onCompleted handler instead to initialize SortFilterProxyModel
    Component.onCompleted: sourceModel = jsonModel
    sorters: [
        RoleSorter {
            id: groupSorter
            roleName: "subGroup"
        },
    ]
}

AppListView {
    id:view
    model: sortedModel
    anchors.fill: parent

    section.property: "subGroup" //How I have used it previously before needing to set 'roles' as my property (which shows nothing)
    section.delegate: SimpleSection {}

delegate: SimpleRow {
    id: container

    text: model.firstname
    detailText: model.surname
    }
}
}

从上面的 JSON 中,预期的结果是我的 listView 在roles嵌套中有 4 个部分。 Assistant, Reception, Stylist, Technical

我的问题是: 我想使用rolesas my ListView {section.property},并且用户的可见性取决于他们在该角色中的布尔值 - 所以从上面的例子来看;爱德华在接待处和造型师中都可见,而克莱尔在助理和造型师中都可见!

如何将嵌套的 JSON 定义为列表中的部分属性?

- - - 更新 - - -

proxyRole通过在 my中添加一个附加项SortFilterProxyModel { },如图所示:

proxyRoles: ExpressionRole {
            name: "role"
            expression: JSON.stringify(model.roles)
       }

并将我的更改section.property:为“角色”我可以为具有匹配角色的人创建部分,更接近,但仍不符合预期(请参阅随附的屏幕截图)

我进一步尝试循环遍历数据,有很多变体:

        expression: {
            for(var x in model.roles){
                if(model.roles[x] === 1){
                    x
                }
            }
        }

并返回最终索引(如上所料)或再次将项目推送到新数组但仍将它们全部返回。

ListView 与 ExpressionRole

4

1 回答 1

1

ListViews创建从其模型数据派生的每个委托,这意味着不能有效地复制委托,这就是我试图根据用户角色中的布尔值所做的事情。

我纠正了这一点,当创建数组时,任何在其角色中具有多个布尔值的用户都会为每个角色获取一个额外的数组对象,并将 mysection.property指向每个单独的角色名称。

从下面的代码中,爱德华将创建 2 个数组对象,然后充当“重复”委托。

[{
"firstname":"Edward",
"subGroup":"Reception",
"admin":1,
"roles":
    {"Assistant":0,"Reception":1,"Stylist":1,"Technical":0
    }
},
{
"firstname":"Claire",
"subGroup":"Stylist",
"admin":1,
"roles":
    {"Assistant":1,"Reception":0,"Stylist":1,"Technical":0
    }
}]
于 2020-06-12T13:45:46.360 回答