2016-02-28 1 views
1

В основном я пытаюсь перемещаться между двумя видами (назовем их view1 и view2) с использованием функции Router.navigate. Мне нужно передать некоторые данные из view1 в view2 во время навигации, и для этого я использую агрегатор событий событий Aurelia, как описано ниже. Кроме того, view2 имеет элемент ref, который мне нужен для доступа внутри события подписки.Как синхронизировать Aurelia EventAggregator с жизненным циклом ViewModel

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] 

Очевидно, что s не был потоком выполнения, который я ожидал. Может кто-нибудь, пожалуйста, объясните мне, что мне не хватает?

+0

Извините, мой последний комментарий был искажен. Какой браузер вы используете? –

+0

@AshleyGrant проверен на Chrome 48 и Firefox 43 – Tinadm

+0

EventAggregator полезен для развязки компонентов друг от друга, но IMHO лучше всего подходит для обмена данными между компонентами в одном и том же представлении. Для связи между представлениями я вместо этого храню данные в window.localStorage. –

ответ

1

Я не смог реплицировать поток журналов консоли в Chrome 48. Я скажу, что, возможно, вам стоит рассмотреть возможность размещения вызова subscribeOnce в конструкторе класса, чтобы убедиться, что EventAggregator осведомлен о вашей подписке как можно скорее ,

Пожалуйста, обратите внимание, что attached является частью компоненты жизненного цикла, а не часть страницы жизненного цикла маршрутизатора, и, таким образом, вы могли бы быть лучше использовать activate методы вместо attached для все, что вы делаете в этом случае. Я не могу быть уверен, что это правильный метод для вашего случая использования без дополнительного контекста, но вы можете дважды проверить его. Я должен быть доступен сегодня на Gitter, если вы хотите, чтобы я попросил меня помочь.

 Смежные вопросы

  • Нет связанных вопросов^_^