循环遍历 ListView 以匹配日历 selectedDate

Loop through ListView for matching calendar selectedDate

我希望用数组 (calendarListModel)

中的数据填充当前 selectedDate 日历上的 listView 事件

当从日历中选择一个新日期时,我需要更新列表,如果在新选择的日期没有事件存在,则清除并保持为空,或者用与新选择的日期匹配的新委托替换 listView。

我的数组是通过读取 firebase 数据库创建的,它按预期工作。我的阵列的一个例子是;

calendarListModel: [
    {"date":2019-02-12,"name":"user1"},
    {"date":2019-02-13","name":"user1"},
    {"date":2019-02-12,"name":"user2"}
]

如果我将我的模型设置为 calendarListModel 我的列表会显示每个数据库条目,而不考虑 listView 上的日期。

我尝试过诸如;

model: calendarListView.date(calendar.selectedDate

还使用循环访问数据,但我没有成功,最近是以下示例;

function updateEvents() {
                    var eventModel = calendarListModel.find(
                                function(obj){
                                return obj.date === calendar.selectedDate.getDate(),
                                console.log(JSON.stringify(obj));
                                }
                            );
                    if (eventModel === undefined)
                        return eventListModel.length = [];
                    return eventListModel.push(eventModel)
                }

Calendar {
        id: calendar
        selectedDate: new Date()

        onSelectedDateChanged: {
            const day = selectedDate.getDate();
            const month = selectedDate.getMonth() + 1;
            const year = selectedDate.getFullYear();
            updateEvents()
        }
    }

            ListView {
            id:eventListView
            model: eventListModel
        }

我来自 JSON.stringify(obj) 的控制台日志似乎将我的数组拆分为单个对象,日志显示:

{"date":1549972800000,"name":"user1"} {"date":1550059200000,"name":"user1"} {"date":1549972800000,"name":"user2"}

但是这样做时 eventListVieweventModel 仍然是空白?

我该怎么做才能纠正这个问题或者我需要朝哪个方向努力?

您传递给 find 的函数有问题。

function(obj) {
    return obj.date === calendar.selectedDate.getDate(),     // <-- oh no! lé comma!
        console.log(JSON.stringify(obj));
}

请注意,您使用了逗号运算符,在 JS 中,它将丢弃左侧的表达式和 return 右侧的结果(此处为 undefined,因为这就是 console.log returns).在 JS 控制台上的快速测试表明这不会产生并且 return 期望的结果(在您的情况下是布尔值)。

function comma() {
    return 1, console.log('blunder');
}
function noComma {
    console.log('success');
    return 1;
}

x = comma();    // blunder
y = noComma();  // success

console.log(x);  // undefined   //  but expected 1 ?!?
console.log(y);  // 1

您可能正在寻找这样的东西:

function(obj) {
    console.log(JSON.stringify(obj));

    return obj.date === calendar.selectedDate.getDate();
}

但是,这会将一个...字符串 (?) 与一个整数(return 由 getDate() 编辑)进行比较。你可能想改为做

return new Date(obj.date).getDate() === calendar.selectedDate.getDate();

这仍然记录 obj 而 return 一个布尔值。

Read more about JavaScript's comma operator...