为 ListModel QML 中的值创建绑定

Create a binding for a value in ListModel QML

我有一个 ListModel 和 ListView,用于显示用户拥有的通知。每次弹出新通知时,ListView 都有一个 add 转换。现在,我想向 ListModel 添加一个时间戳(以分钟为单位)以显示通知的时间,但是由于我在创建通知时向 ListModel 添加了值,所以我必须每分钟手动更新一次模型以更改时间戳,这又触发了我的 add 转换。如何在不每次都重新添加值的情况下更新时间戳?

property int numNotifications: backend_service.num_notifications

onNumNotificationsChanged: {
    notificationModel.clear()
    for(var x=0; x<numNotifications; x++) {
           var notif = backend_service.notifications.get(x);
           notificationModel.insert(0, {"name":notif.name, "time":notif.time})
    }
}
        Rectangle {
            height: 500
            width: 0.90 * parent.width
            anchors {
                top: parent
                topMargin: 30
                left: parent.left
                leftMargin: 45
            }
            ListView {
                anchors.fill: parent
                model: notificationModel
                delegate: notificationDelegate
                spacing: 30

                add: Transition {
                    NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 1000 }
                }
            }
        }

        ListModel {
            id: notificationModel
        }

        Component {
            id: notificationDelegate
            Row {
                spacing: 20
                Text { text: name; color: "white" }
                Text { text: time; color: "white" }
            }
        }

time 是通知以分钟(1 分钟、2 分钟等)多长时间为单位的衡量标准,我必须更新该值。该值在 backend_service 中自动更新,但 ListModel 保留首次添加时的旧值。我想在不更改模型的情况下更新该时间值。有没有办法做到这一点而不必每次都更新模型,也许是通过创建绑定?我也愿意接受其他方法来实现这一目标。

我的建议是模型应该有一个固定的时间戳,而不是一个相对的时间戳。然后您可以选择在视图中相对于当前时间显示它(委托)。

property date now: new Date()

Timer {
    running: true
    repeat: true
    interval: 60 * 1000  // Every minute
    onTriggered: {
        now = new Date()
    }
}

Component {
    id: notificationDelegate
    Row {
        spacing: 20
        Text { text: name; color: "white" }
        Text { 
            color: "white"
            text: {
                var diff = now - time

                // Display relative time, something like this...
                if (diff > [1 minute]) {
                    return "1 minute ago"
                } else if (diff > [2 minutes]) {
                    return "2 minutes ago"
                }
                else ... // etc.
            }
        }
    }
}