Erweitern des Controllers in der ExtJS 4 MVC-Anwendung

9

Ich erstelle meine ExtJS 4-Anwendung, die der MVC-Struktur folgt. Ich möchte ein erweiterbares Gitter MyGrid mit einigen Funktionen erstellen, die ich mehrmals wiederverwenden kann. Daher sollte es, denke ich, einen eigenen Controller haben, der ebenfalls erweitert wird, so dass die Funktionalität vererbt wird. Wie ist das richtig gemacht?

Im folgenden Code illustriere ich, wie ich den Controller MyGrid mit MyExtendedGrid erweitere. Ich stelle fest, dass ich die init -Funktion im MyGrid-Controller überschreiben, so dass es nie aufgerufen wird. Wird das Problem einfach dadurch gelöst, dass in MyGrid der Befehl "super" init von MyExtendedGrid init aufgerufen wird oder die Objekte control zusammengeführt werden? Ist das der richtige Weg, dies im Sinne von MVC zu tun? Wenn ja, wie?

controller / MyGrid.js:

%Vor%

controller / MyExtendedGrid.js:

%Vor%

view / grids / MyGrid.js:

%Vor%

view / grids / MyExtendedGrid.js:

%Vor%     
Louis 02.03.2012, 17:56
quelle

2 Antworten

2

Ok, nach einigem Nachdenken habe ich mich für die folgende Lösung entschieden, die den Vorteil hat, dass mygrid nichts über myextendedgrid wissen muss.

Ich erweitere meinen Gridview wie in der Frage.

Ich habe dem Basis-Grid einen eigenen Controller zugewiesen, um allgemeine Funktionen auszuführen, zum Beispiel deleteButton.setDisable(false) , wenn im Grid etwas ausgewählt ist.

Als nächstes erinnere ich mich daran, dass die Verwendung von refs:[ (zum Beispiel mit selector: 'mygrid' ) mehrdeutig auf beide Instanzen der Basisklasse jeder erweiterten Instanz zeigen würde. Wenn Sie me.control({ I verwenden, erhalten Sie stattdessen das relevante Raster, indem Sie das aktivierte Element mit up :

durchlaufen %Vor%

Das erweiterte Gitter gebe ich einen eigenen Controller und hier könnte ich refs verwenden. Ich erweitere den Controller nicht aus der MyGrid-Klasse (sondern aus 'Ext.app.Controller' ), es sei denn, ich möchte Funktionen oder Variablen aus dem MyGrid-Controller verwenden. Alle Controller werden von app.js gestartet mit:

%Vor%

Um das Raster zu erhalten, wenn Zeilen im Raster ausgewählt sind, habe ich das Raster im Auswahlmodell wie folgt gespeichert:

In Controller / MyGrid.js:

%Vor%     
Louis 08.03.2012, 15:21
quelle
1

Es ist eigentlich ein bisschen schwieriger ...

Hier ist, was wir in unserer Anwendung gemacht haben (wir haben genau die gleiche Situation - eine Art Basis-Controller, der an vielen verschiedenen Orten wiederverwendet wird)

  1. Behalten Sie die Init-Funktion im Basis-Controller bei.

  2. Definieren Sie eine gemeinsame Basismethode in diesem Basis-Controller (wie gridRendered - wo Sie ständig etwas für alle Controller tun müssen).

  3. Abonnieren Sie die Ereignisse in allen untergeordneten Controllern, abonnieren Sie Ereignisse jedoch mithilfe der Methoden des Basiscontrollers. Es wird sonst nicht funktionieren - der Basis-Controller hat keine richtigen Referenzen, um Ereignisse korrekt zu abonnieren.

Ich kann paar Quell-Snippets posten, aber ich denke, es ist ziemlich einfach.

    
sha 02.03.2012 20:51
quelle

Tags und Links