Как синхронизировать 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 за дополнительной помощью.

Другие вопросы по тегам