Это связано с тем, как работает Метеор.
Когда клиент запускается, у него еще нет данных. Затем клиент открывает подписки на сервере (при условии, что у вас все еще установлен пакет автоматической публикации по умолчанию, это сделано для вас), который вскоре отправляет данные.
Именно эта «вскоре после» часть является проблемой здесь.
В вашем случае это означает, что когда Tweets.findOne()
выполняется, у него еще нет данных, и поэтому нет документа для чтения text
. Таким образом, ошибка. Предотвратите ошибку, проверив, был ли возвращен документ:
Template.tweet.onCreated(function () {
var doc = Tweets.findOne();
if (doc) {
this.text = new ReactiveVar(doc.text);
}
});
Если вы попробуете это, ошибка исчезнет, но текст по-прежнему не будет отображаться.
Итак, теперь мы хотим, чтобы этот участок кода запускался снова, когда доступны данные. Blaze делает это автоматически в помощниках, но везде вам нужно обернуть его в autorun
:
Template.tweet.onCreated(function () {
this.text = new ReactiveVar();
this.autorun(() => {
var doc = Tweets.findOne();
if (doc) {
this.text.set(doc.text);
}
});
});
Я также переместил создание реактивной переменной из автозапуска, потому что мы хотим создать ее только один раз, а затем установите или получите его значение.
В качестве альтернативы, я упоминал ранее, что помощники автоматически запускаются. Это означает, что вы можете найти твит в помощнике, чтобы немного упростить ваш шаблон:
Template.tweet.helpers({
text() {
var doc = Tweets.findOne();
if (doc) return doc.text;
},
});
Более того, нам больше не нужен ReactiveVar
и мы можем удалить всю функцию onCreated
! [ 1116]
Используйте фоновый рабочий поток, поскольку это - знающий насос сообщения UI, Эта Статья MSDN, хотя главным образом о WPF действительно указывает, что BWT является UI, знающий даже для форм окон.
Диспетчер является компонентом WPF, не компонентом WinForms.
, Если бы Вы хотите диспетчеризировать объекты работы на потоке UI, тогда необходимо было бы или использовать Управление. BeginInvoke, поскольку Вы уже нашли или реагируете на ResetEvents/WaitObjects через потоки.
Обычно вызывающие объекты работы на потоке UI являются плохой вещью, если это не обрабатываемая деталь UI (т.е. обновление контента управления или чего-то), в этом случае Управление. BeginInvoke () был бы достаточен.
Вы можете использовать Dispatcher
даже в приложении WinForms.
Если вы уверены, что находитесь в потоке пользовательского интерфейса (например, в обработчике button.Click), Dispatcher.CurrentDispatcher
предоставляет диспетчер потоков пользовательского интерфейса, который впоследствии можно использовать для отправки из фоновых потоков в поток пользовательского интерфейса, как обычно.
Take a look at backgrounder and see if it fits your needs.