Теперь я наконец решил это, и оказалось, что компонент действительно действительно обновлялся в любое время, но я не заметил это, просто потому, что последний элемент в массиве был тихо добавлен к основанию раскрывающегося списка. Этого, однако, я не ожидал, так как я опубликовал коллекцию с нисходящей сортировкой .
// server-side
Meteor.publish('sessions', function() {
return Sessions.find({ userId: this.userId }, { sort: {createdAt: -1} });
});
На стороне сервера, похоже, не то место для сортировки. Это просто не имеет эффекта. Так сортируется на стороне клиента, при подписке:
// client-side
export default withTracker(() => {
const handle = Meteor.subscribe('sessions');
return {
isLoading: !handle.ready(),
sessions: Sessions.find({}, { sort: {createdAt: -1} }).fetch()
};
})(App)
Я пропустил важную деталь в своем вопросе, то есть, как я установил значение в раскрывающемся поле:
<select value={this.props.sessions[0].currentCsv}>
{this.csvsInSession(sessions)}
</select>
Итак, урок усвоен: если вы думаете, что ваш компонент реагирования не рендерится, всегда проверяйте, так ли это, прежде чем предполагать это.
В качестве побочного эффекта отладки я реструктурировал свои компоненты. Теперь Meteor.subscribe()
находится внутри родительского компонента, который содержит все дочерние элементы, которые должны обрабатывать объект sessions
. И объект sessions
передается от родителя (великим) потомкам в качестве реквизита. Я думаю, что так легче читать и легче поддерживать.