2015-08-25 9 views
13

Ich verwende Aurelia Framework mit Typescript und in der event aggregator kann ich Kanäle veröffentlichen und abonnieren.Aurelia Abmelden Ereignisaggregator

Das Problem ist, dass ich nicht von einem Kanal abmelden kann.

Hinweis: Alle Formen der subscribe-Methode geben eine Dispose-Funktion zurück. Sie können diese Funktion aufrufen, um das Abonnement zu entfernen und den Empfang von Nachrichten zu beenden. Ein guter Ort, um zu disponieren, ist entweder ein deaktivierter Callback eines View-Modells, wenn es von einem Router verwaltet wird, oder ein separater Callback, wenn es sich um ein anderes View-Modell handelt.

Dies ist aus der aurelia official documentation website übernommen und ich verstehe nicht wirklich, wie dies zu implementieren ist.

Ich ging auf die aurelia gitter channel und ich fand 3 Diskussionen darüber, wo einer von ihnen das folgende Beispiel für Abmelde gab:

sub = ea.subscribe(); 

//unsubscribe the event 
sub(); 

Das Problem ist, dass dieser Code nicht in Typoskript funktioniert.

Wie kann ich mich von einem event aggregator in Typescript abmelden?

nun mit diesem Code

@inject(Publisher, Subscriber) 
export class Home { 
    publisher: Publisher; 
    subscriber: Subscriber; 
    channelName = "testChannel"; 

    constructor(pub: Publisher, sub: Subscriber) { 
     this.publisher = pub; 
     this.subscriber = sub; 

     this.subscriber.subscribe(this.channelName); 

     this.publisher.publish(this.channelName, "Ana are mere"); 
    } 
} 


@inject(EventAggregator) 
export class Publisher { 
    eventAggregator: EventAggregator = null; 

    constructor(agg: EventAggregator) { 
     this.eventAggregator = agg; 
    } 

    publish(channelName: string, object: Object) { 
     this.eventAggregator.publish(channelName, object); 
    } 
} 


@inject(EventAggregator) 
export class Subscriber { 
    eventAggregator: EventAggregator = null; 

    constructor(agg: EventAggregator) { 
     this.eventAggregator = agg; 
    } 

    subscribe(channelName: string) { 
     this.eventAggregator.subscribe(channelName, object => { 
      //TODO do something with received object 
      alert(object); 
     }); 
    } 
    unsubscribe(channelName: string) { 
     debugger; 
    } 
} 

wenn die Home Komponente ausgeführt wird, das Verfahren zur Zeichnung wird nicht nur einmal ausgeführt, sondern so oft wie der cosntructor aufgerufen wurde. Also, wenn ich 3 mal auf der Startseite war, wird es 3 Mal ausgeführt.

So: Warum wird meine Abonnentenmethode mehrere Male ausgelöst? Wie kann ich mich in TypeScript von event-aggregatoor abmelden?

Danke!

Antwort

21

10/14/2015 EDIT

Die subscribe Funktion der Eventaggregator-Klasse gibt ein "entsorgen" -Funktion "Abonnement" Objekt:

var subscription = eventAggregator.subscribe('some event', value => alert(value)); 

Sie müssen einen Verweis auf das Abonnement halten Objekt, damit Sie das Abonnement zerstören können, wenn es nicht mehr benötigt wird.

In einem Ansichtsmodell ist die perfekte Zeit, um ein Ereignis zu abonnieren, wenn es attached ist. Ebenso ist es eine perfekte Zeit, sich abzumelden, wenn es detached ist.

Hier sehen Sie, wie Ihr View-Modell Home aussehen würde, wenn es dieses Muster verwendet (Anmerkung: Ich habe Ihre Subscriber- und Publisher-Klassen fallen gelassen, weil sie unnötige Komplexität um den EventAggregator herum hinzufügen und die Erklärung erschweren die Lösung für Ihr Problem).

@inject(EventAggregator) 
export class Home { 
    eventAggregator: EventAggregator; 
    subscription: { dispose:() => void }; 

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

    attached() { 
    this.subscription = this.eventAggregator.subscribe('some event', value => alert(value)); 
    } 

    detached() { 
    this.subscription.dispose(); 
    } 
} 
+0

Was ich wirklich vermisst habe, war der Hinweis auf die Dispose-Funktion. Vielen Dank! :) –

+2

Dies ist in der Oktober-Version von Aurelia aktualisiert. Der Subskriptionsaufruf gibt jetzt ein Subskriptionsobjekt zurück, mit dem Sie die dispose() -Methode aufrufen können, um das Abonnement zu beenden. –

1

Sie müssen sich bei disable()/detach() abmelden, soweit mir bekannt ist, dass Typescript dies nicht ändert.