Как синхронизировать Aurelia EventAggregator с жизненным циклом ViewModel
В основном я пытаюсь перемещаться между двумя моделями представления (назовем их view1 и view2) с помощью функции Router.navigate. Мне нужно передать некоторые данные из view1 в view2 во время навигации, и для этого я использую агрегатор событий Aurelia, как описано ниже. Кроме того, view2 имеет элемент ref, который мне нужен для доступа внутри события подписки.
View1
...
this.router.navigate("view2").then(() => {
console.log("Publishing message");
this.eventAggregator.publish(new ShareDataMessage(dataToShare));
});
View2
...
attached() {
console.log("View attached");
console.log("RefItem 1: " + this.refItem);
this.eventAggregator.subscribeOnce(ShareDataMessage, message => {
console.log("Event received")
console.log("RefItem 2: " + this.refItem);
});
}
Однако, если я запускаю приложение и перехожу от view1 к view2, я получаю следующий вывод:
Publishing message
Event received
RefItem 2: null
View attached
RefItem 1: [object HTMLImageElement]
Очевидно, это был не тот поток выполнения, который я ожидал. Может кто-нибудь объяснить, что мне не хватает?
1 ответ
Мне не удалось реплицировать ваш поток журналов консоли в Chrome 48. Я скажу, что, возможно, вам следует подумать о том, чтобы поместить вызов subscribeOnce в конструктор класса, чтобы убедиться, что EventAggregator знает о вашей подписке в кратчайшие возможные сроки.
Обратите внимание, что attached
является частью жизненного цикла Компонента, а не частью жизненного цикла страницы Маршрутизатора, и поэтому вам может быть лучше использовать activate
метод вместо attached
за то, что вы делаете в этом случае. Я не могу быть уверен, какой метод подходит для вашего случая использования без дополнительного контекста, но вы можете проверить еще раз. Я должен быть доступен сегодня на Gitter, если вы хотите отправить мне в PM за дополнительной помощью.