IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques & Frameworks Discussion :

Récuper le ContentPane Actif


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut Récuper le ContentPane Actif
    Bonjour, aprés avoir essayé de nombreuses solutions, je commence à desespérer d'arriver à trouver comment savoir lequel des onglets est actif:

    Voila mon Script qui me crée les ContentPane
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    //Initialisation des modules
    	function initModulesTabs(){
    		var tabContainer = dijit.byId("mainTabContainer");
    		//console.debug("Suppression des tabs");
    		reinitTC = true;
    		var children = tabContainer.getChildren();                         
            for (k=0; k<children.length; k++){
                    if(children[k].id != "toolTipContentPane")
                    	tabContainer.closeChild(children[k]);
            }
            reinitTC = false;
     
    		// on itere pr trouver les modules à ajouter pour l'utilisateur et le widget en cours
    		for(i=0; i<modules.length; i++){
    			//console.debug("Ajout du module " + modules[i].id);
    			//console.debug(modules[i]);
     
    			if(!modules[i].masquer){
    				console.debug("Le contentpane n'existe pas, on le créee");
    				// on crée un objet module
    				var moduleTab = new dijit.layout.ContentPane({
    					id : modules[i].id,	
    					title : modules[i].titre,
    					closable:true,
    					onClose:supprimer
    				});	
     
    				//Le contenu du Module
    				moduleTab.attr("content",modules[i].titre);
    				//
     
    				modules[i].contentPane = moduleTab;
    				//on ajoute le module au main tabcontainer
    				tabContainer.addChild(moduleTab);
    			}
    		}
    	}
    Voila mon TabContainer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	<div id="mainTabContainer" dojoType="dijit.layout.TabContainer" style="width: 400; height: 250"></div>
    	</div>
    Dans l'idéal j'aimerai avoir le numéro du module actif dans une alert lorsque je change d'onglet...

    merci d'avance pour votre aide

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    je m'autorépond ^^:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var moduleTab = new dijit.layout.ContentPane({
    					id : modules[i].id,	
    					title : modules[i].titre,
    					closable:true,
    					onClose:supprimer,
    					onShow:function(){			
    						var widget=dijit.byId("mainTabContainer");			
    						var child = widget.selectedChildWidget;
    						alert(child);				
    					}
    				});
    Seulement, le child que j'affiche ne correspond pas au module qui devient actif mais à celui qui l'étais auparavant

    Une idée ?

  3. #3
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabContainer1.selectedChildWidget
    ou bien tu peux souscrire à l'événement publié tabContainer1-selectChild

    ERE

    EDIT: Grillé !
    ----

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    Salut,

    Malheursement, le selectedChildWidget me ramène pas la bonne valeur dans le alert mais celle correspondant au contentPane qui était actif... je sèche un peu

  5. #5
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Si tu veux que le tab ajouté devienne celui actif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var moduleTab = new dijit.layout.ContentPane({
    					id : modules[i].id,	
    					title : modules[i].titre,
    					closable:true,
    					onClose:supprimer
    				});
    
    dijit.byId("mainTabContainer").selectChild(moduleTab );
    Ou alors c'est que je ne comprends pas ce que tu veux faire
    ERE

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    Non en fait j'ai du mal m'expliqué, désolé.

    En fait, la méthode initModulesTabs() sert à permettre le rafraichissement d'un widget. Par exemple, quand un module est supprimé, la méthode est appellé et permet d'afficher les changements. Ce système ne doit pas être le meilleur mais fonctionne convenablement.

    Actuellement mon problème est de savoir quel est le module actif (celui qui est affiché) pendant l'utilisation.

    En gros, quand je clique sur l'onglet j'aimerai avoir une belle alert box m'affichant l'id du Tab qui devient actif.

    Edit: des screen pour essayer de me faire comprendre :
    Ici, on a l'état initial


    Ici je clique sur l'onglet Sport24, et l'alert m'affiche que le module onShow est le module 5 alors que ça devrait être le 4.

  7. #7
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Re,
    Citation Envoyé par Jere3110 Voir le message
    Non en fait j'ai du mal m'expliqué, désolé.

    En fait, la méthode initModulesTabs() sert à permettre le rafraichissement d'un widget. Par exemple, quand un module est supprimé, la méthode est appellé et permet d'afficher les changements. Ce système ne doit pas être le meilleur mais fonctionne convenablement.

    Actuellement mon problème est de savoir quel est le module actif (celui qui est affiché) pendant l'utilisation.

    En gros, quand je clique sur l'onglet j'aimerai avoir une belle alert box m'affichant l'id du Tab qui devient actif.
    Ok. Ton souci provinet du fait que quand onShow est généré, selectedChildWidget n'a pas encore été affecté. Par contre ton contentPane a déjà son attribut selected à true. Une solution est donc de passer en revue les contentPane et de regarder lequel a .selected==true.
    Mais ce n'est pas très pratique. On en revient à ma seconde solution de d'taleur: souscrire un abonnement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dojo.subscribe("mainTabContainer-selectChild", 
                         null, 
                         function(page) {
    				alert(page.id);
    			});
    ERE

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    Re et merci pour ta réponse rapide:

    j'ai du mal à comprendre le fonctionnement du dojo.sucribe.

    A quel moment intervient t'il dans le code ?

  9. #9
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    j'ai du mal à comprendre le fonctionnement du dojo.sucribe.
    Dojo propose un mécanisme de file de messages, sur le principe de la publication-souscription. Tu définis un topic (file de message) et tu envoies des informations vers ce topic (c'est fait via dojo.publish(topic, infos)). L'avantage c'est que tu envoies des infos à personne en particulier, uniquement à ceux qui se sont abonnés au topic (via la fonction réciproque dojo.subscribe(topic,context,fonction)).

    Dans ton cas, plutôt que de générer un événement onClick c'est une info widget-page-selectionnée qui est envoyée vers le topic mainTabContainer-selectChild. tu dois donc t'y abonner pour recevoir l'info.

    Je vois venir ta question: "pourquoi avoir choisir ici cette technique de publish-subscribe alors qu'un onClick déclenché sur l'onglet fait l'affaire ?".
    Tout simplement parce que le TabContainer ne sait pas qu'un clic a lieu sur un onglet... Il hérite de StackContainer (une simple pile de div, utilisé pour d'autres widgets) qui lui ne gère pas d'onglet ou autre; StackContainer ne connaissant pas le contexte de son utilisation envoie donc des messages vers des topics.
    Il en est de même pour les ajouts-suppression dans les Tree et autres DnD.

    Enfin, cela permet de découpler ton code: imagine que tu souhaites utiliser une zone où afficher de l'information (car formulaire mal rempli, mail qui arrive...). En mode "normal" tu créeras un composant avec une fonction displayInfo(msg) et à chaque fois que tu voudras faire afficher une info ton code devra appeler composantInfo.displayInfo("message à afficher");. Mais deux soucis: il faut que ton code (ou les composants) qui souhaite afficher une info instancie ton composant composantInfo et ensuite le code est rendu dépendant de composantInfo, ce qui est assez nul s'il est exécuté au sein d'une class, d'un widget etc...
    Pour résoudre cela: tu crées ton composant composantInfo qui informera écouter sur le topic "information". Dès lors quiconque veut afficher de l'info peut appeler dojo.publish("information", ["Message à afficher"]); sans se préoccuper de savoir qui traite et comment.
    Ton composant composantInfo implémentera lui de son côté dojo.subscribe("information, contexte,function(msg) {...});". Il ne saura pas qui lui envoie de l'info mais ce n'est pas sa vocation !
    Il n'y a plus de lien entre les deux côtés éléments, le découplage est réalisé.

    Donc en bref: publish-subscribe pour gérer les contraintes de conception d'héritage et découpler ton code.

    C'est tout simplement géant, mais très peu et très mal utilisé !


    A quel moment intervient t'il dans le code ?
    Tu auras compris que tout est asynchrone et donc que tu mets ton code (dojo.publish et dojo.subscribe) où tu veux, c'est dojo qui joue au chef d'orchestre

    ERE

Discussions similaires

  1. [Dojo] TabContainer: quel contentPane (tab) est actif (affiché) ?
    Par Lnhab dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 27/11/2009, 01h09
  2. Réponses: 3
    Dernier message: 31/08/2007, 18h31
  3. récuperation d'un numéro de téléphone
    Par herzleid dans le forum Delphi
    Réponses: 4
    Dernier message: 17/07/2007, 09h25
  4. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01
  5. Réponses: 2
    Dernier message: 04/10/2002, 09h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo