2016-03-31 14 views
0

ich über Vermittler gelesen haben, Ereignis-Aggregator, mit, backbone.events ... etcBackbone-Kommunikation zwischen den Ansichten, ein anderes Muster

ich über eine andere mögliche Muster unten beraten müssen, denken Sie, dieses Übel? oder gut? wenn nicht gut, was sind die Vorbehalte/Probleme.

Dieses "Muster" beantwortet ein sehr klassisches Problem. Wenn Sie auf View1 klicken, muss View2 gerendert werden. View1 und View2 sind unabhängig (dies ist kein Subview-Fall). Zwischen View1 und View2 verwenden wir ein "Actions" -Modul (ja, mehr oder weniger inspiriert von react/flux). Hier

ist der Plan in Pseudo-Code:

View1: 
    initialize: 
     Actions.subscribe(this, 'view2); 

View2: 
    onclickwtv: 
     Actions.displayView2(); 

Actions: 
    this._Views = []; 
    subscribe(view, viewName): 
     this._Views[viewName] = view; 

    displayView2: 
     this._Views['view2'].render(); // or show or wtv function needed 

Wenn eine Ansicht entfernt wir eine Austragen Funktion in Aktionen aufrufen würde, die die spezifische Ansicht von der _Views Array pop würde.

Ziel dieses Schemas ist es, die verschiedenen möglichen Interaktionen zwischen Ansichten sichtbar zu machen (anstelle eines Ereignisaggregators, in dem Sie keine zentrale Stelle haben, um diese Interaktionen zu sehen).

Ich kann es kaum erwarten, Ihre Gedanken darüber zu lesen!

+1

Ihre Frage könnte für Code Review, http://codereview.stackexchange.com geeigneter sein. Das heißt, ich denke, Ihre Lösung hat zu viel Kopplung. Es wäre besser, wenn Actions die Ansichten initialisiert und abonniert hätten. Die Ansichten können Aktionen ignorieren und können glücklicherweise Ereignisse auslösen, die sich unbekümmert darum kümmern, wer gerade zuhört. – 76484

+0

Aufrufe sind meist in Router oder manchmal in Eltern Ansichten –

+0

Dank für Ihr Feedback –

Antwort

1

Ich hätte View2 ein Ereignis auf einem Aggregator Objekt auslösen:

onclickwtv: function() { 
    Aggregator.trigger('wtc-click'); 
} 

Und ich hätte Ansicht1 zu diesem Ereignis abonnieren:

initialize: function() { 
    this.listenTo(Aggregator, 'wtc-click', this.render); 
} 

Mit Ansicht1 zu Aktionen abonnieren, damit Aktionen aufrufen View1.render() ist nur eine roud-über-Möglichkeit, das gleiche zu erreichen. Ihre Lösung hat drei Entscheidungsobjekte, meins hat nur zwei. Und meine Lösung erfordert keine Verwaltung der Ansichtszustände - eine Ansicht hört auf, den Aggregator zu hören, wenn ihre Methode .remove() aufgerufen wird.

+0

das ist gut. Daran habe ich gestern gedacht. Ich habe auch über ein gemeinsames Modell in Singleton nachgedacht, wenn Ansichten zusammen auf eine Art von Datenänderung reagieren müssen, was denkst du? –

+0

Ich hatte einmal eine Filteransicht und eine Seitenumbruchansicht mit jeweils eigenen Modellen. Wenn sich der aktuelle Filter änderte, musste die aktuelle Seite auf 1 gesetzt werden. Dies wurde erreicht, indem ein Mastermodell mit dem Filtermodell und dem Paginierungsmodell als Instanzen verwendet wurde. Dieses Mastermodell enthielt die Logik zum Anhören des Filtermodells und zum Festlegen des Paginierungsmodells. – 76484