我正在使用来自数组(listView)的数据填充日历的当前selectedDate上事件的calendarListModel

从日历中选择一个新日期时,如果新选择的日期不存在任何事件,则我需要该列表进行更新,清除并保持空白,或者用匹配新的selectedDate的新委托替换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中将舍弃左侧的表达式并返回右侧的结果(此处为undefined,因为这是console.log返回的结果)。在JS控制台上进行的快速测试表明,这不会产生并返回所需的结果(在您的情况下为布尔值)。

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();
}


但是,这会将...字符串(?)与整数(由getDate()返回)进行比较。您可能想做

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


返回布尔值时,它仍然记录obj

Read more about JavaScript's comma operator...

关于javascript - 遍历ListView以匹配选定的日历,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54819034/

10-12 06:27