Verhindere das Rendern (Ausblenden und / oder Deaktivieren) einer Komponente zur Konstruktionszeit

8

Hintergrund: Unsere App ist immer als Ganzes gepackt, aber durch den Benutzerzugriff können einige serverseitige Aktionen eingeschränkt sein. Wir wissen, welche Aktionen zum Zeitpunkt des Starts der App zulässig sind. Wir wollen jetzt alle Ansichten (Panels, Buttons, etc.) von dem Benutzer verstecken, zu dem er keinen Zugang hat.

Dafür haben wir ein Plugin geschrieben, das auf jede Komponente angewendet werden kann. Aber hier kommen die Probleme:

Hier ist, was wir versuchen, gegen den Plugin-Host zu laufen:

%Vor%

Zuerst dachten wir, je früher wir das machen, desto besser. Also haben wir versucht, es zur Laufzeit des Plugins auszuführen. Aber das war nicht möglich, weil die Listener (des Hosts) noch nicht bereit zu sein scheinen (die Komponente versucht, das hide-Ereignis auszulösen). Also haben wir es in die init -Methode des Plugins verschoben, die keinen Fehler verursacht, aber nur teilweise funktioniert. Nur das Ereignis beforerender wurde wirklich angewendet, aber es hat nur das Rendern des Kinds abgebrochen. Wir hatten also eine kaputte Komponente (die Grenzen sind da und der Inhalt nicht). Wenn wir die Ereignisregistrierung kommentiert haben, blieb der Host unberührt. Wir haben auch die Verwendung von nur hidden:true und disabled:true ohne Glück getestet.

Wie können wir das Rendern der Komponente auf die richtige Art und Weise verhindern?

Bearbeiten:

Die Komponente sollte als deaktiviert und ausgeblendet markiert werden, da die Erstellung der Komponente nicht verhindert werden kann. Der Ausschnitt, den ich von meinem Kollegen bekommen habe, war falsch, also hat der Aufruf von setVisible(false) funktioniert, wir schätzen disable() auch. Aber die Komponente wird immer wieder gerendert und wir scheinen nicht wirklich in der Lage zu sein, dies zu verhindern, ohne mit einer halb gerenderten Komponente zu enden.

Antwort von @AlexTokarev

Ich habe versucht, was @AlexTokarev vorgeschlagen hat. Dazu habe ich die folgenden Zeilen in den Plugin-Konstruktor

eingefügt %Vor%

Basierend auf dem Debugging weiß ich, dass die Einstellungen sehr früh angewendet werden (in der Ext.AbstractComponent.constructor ), aber ich lande immer noch mit einer versteckten und gerenderten Komponente.

Kommentar von @sbgoran

In einem Testfall verwenden wir ein Spaltenlayout, in dem alle Container aus derselben Klasse stammen. Sobald ich unser Plugin (mit dem Ereignis pörrender, das die falsche Konfiguration zurückgibt) in einen dieser Erweiterungscontainer hinzufügt (das Plugin wird direkt zur Klassendefinition hinzugefügt (als ptype)), sehen alle Container innerhalb dieser Spalten kaputt aus (nur Ränder werden gerendert und in der Inhalt eine kleine graue Box in der oberen linken Ecke.). Das abgebrochene Rendering wirkt sich also auf alle untergeordneten Elemente der Spalte aus, wenn nur ein untergeordnetes Element das Rendering abgebrochen hat.

** Beispielcode **

Zuerst möchte ich bemerken, dass wir nach einer Möglichkeit suchen, dies im Allgemeinen zu tun, denn soweit wir wissen, ist das Rendering in ExtJS eine Sache. Ich kann darum bitten, eine Demo zu erstellen, aber ich denke, das wird nicht so einfach sein, da wir Ext.app.portal.Panel für das fehlerhafte Beispiel verwenden. aber das Plugin sollte für jede Art von Komponente funktionieren. Zuerst werde ich einen Demo-Code hinzufügen:

Wir haben eine Ansicht, die in einem Viwport mit Rahmenlayout platziert wird

%Vor%

Innerhalb des Controllers füllen wir diesen

%Vor%

Hier ist das Portal-Panel

%Vor%

Und hier ist das Portlet

%Vor%

Hier ist eine Beispielansicht

%Vor%

Hier ist das Plugin

%Vor%

Hier ist die Spalte Layout

Ext.define ('MVC.app.portal.PortalColumn', {     extend: 'Ext.container.Container',     Alias: 'widget.Portalcolumn',

%Vor%

});

    
JJR 06.10.2013, 08:57
quelle

3 Antworten

3

Haben Sie versucht, autoRender: true in Ihren optionalen Komponenten zu setzen? Hier ist das Dokument: Ссылка

    
Alex Tokarev 08.10.2013 18:39
quelle
1

Sie können es mit den Funktionen zum Ausblenden und Anzeigen versuchen und auch mit dem Ereignislistener "added" versuchen, der nach dem Hinzufügen der Komponente zu container aufgerufen wird.

    
Chandra 08.10.2013 11:46
quelle
1

Versuchen Sie so etwas für Ihr Plugin:

%Vor%     
sbgoran 10.10.2013 08:14
quelle

Tags und Links