Перейдите ListView для соответствия календаря selectedDate - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу заполнить listView событий в текущем selectedDate календаре данными из массива (calendarListModel)

Когда в календаре выбрана новая дата, янеобходимо обновить список, очистить и оставить его пустым, если в новую выбранную дату не существует событий, или заменить 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"}

, но при этом eventListView и eventModel остаютсяпустой?

Что я могу сделать, чтобы исправить это или в каком направлении мне нужно работать?

1 Ответ

0 голосов
/ 24 февраля 2019

Функция, которую вы передали в 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 при возврате логического значения.

Подробнее о запятом в JavaScript ...

...