Aurelia EventAggregator не подписывается

В моем приложении Aurelia есть компонентно-родительская архитектура компонентов. Panel Родительский компонент View-модель, внутри которой находится Tool составная часть.

У меня есть интерфейс для нумерации страниц Panel, нажав на который Tool должен обновить. Проблема в том, что переменная, которая отслеживает, какой номер страницы был нажат, pageNumber доступно только в panel.ts и недоступно в tool.ts, Таким образом, в основном, это проблема связи между двумя моделями представления.

Чтобы решить эту проблему, я использую Aurelia's EventAggregator следуя этому превосходному учебнику. Вот что я написал до сих пор:

panel.html

<a class="page-link" click.delegate="pageClick(1)"> 1 </a>

panel.ts

import {inject} from 'aurelia-framework';
import {EventAggregator} from 'aurelia-event-aggregator';

@inject(EventAggregator)
export class Panel {

eventAggregator: EventAggregator;

constructor(eventAggregator) {
    this.eventAggregator = eventAggregator;
}

pageClick(pageNumber) {
    var pageInfo = {
        pageNumber: pageNumber
    }
    this.eventAggregator.publish("pageClicked", pageInfo);
}

tool.ts

import {inject} from 'aurelia-framework';
import {EventAggregator} from 'aurelia-event-aggregator';

@inject(EventAggregator)
export class Tool {

eventAggregator: EventAggregator;

constructor(eventAggregator) {
    this.eventAggregator = eventAggregator;
}

pageClicked() {
    this.eventAggregator.subscribe("pageClicked",
        pageInfo => {
            console.log(`${pageInfo.pageNumber} was clicked`);
        });
}

Это работает нормально, пока событие не будет запущено. Я попробовал отладку и увидел, что eventAggregator уволил pageClicked событие. Но точка останова на subscribe никогда не был поражен. Каким-то образом subscribe метод не срабатывает. Что мне здесь не хватает?

Моя первоначальная мысль заключается в том, что EventAggregator экземпляр отличается, но я не уверен, должен ли он быть таким же. Любая помощь приветствуется. Кроме того, если вы знаете какой-то другой лучший способ достичь intercomponent communication пожалуйста, дайте мне знать, как. Благодарю.

1 ответ

Решение

Вам необходимо настроить подписку в функции, которая будет вызываться. Может быть, добавить attached Обратный звонок и настроить подписку там. Убедитесь, что вы удалили подписку, вероятно, в detached Перезвоните. Я сейчас на мобильном телефоне, но если вам нужен пример кода, дайте мне знать, и я добавлю его, когда вернусь домой.