2012-04-16 15 views
11

Im utilizzando Dojo per creare una semplice finestra di dialogo per creare un utente in un sistema. Il problema è che ottengo l'errore:Evento di chiusura della finestra di dialogo Dojo su X (in alto a destra)

Tried to register widget with `id==user_submit` but that `id` is already registered 

user_submit, è un tasto Dojo devo finire il modulo all'interno della finestra di dialogo. Quando chiudo la finestra di dialogo facendo clic su di esso e l'invio del modulo non c'è nessun problema ad aprire la finestra di dialogo di nuovo (nel caso fare clic sul pulsante ho questa riga di codice:

dijit.byId("user_submit").destroy(); 

ma se chiudo la finestra attraverso il pulsante [x] -link/nell'angolo in alto a destra non distruggo il pulsante e quindi non riesco ad aprire nuovamente la finestra di dialogo senza ricaricare la pagina

Come ottengo Dojo per distruggere il pulsante o come per sovraccaricare l'evento click su [X] -link/button, quindi posso scrivere il comando destroy per il pulsante?

risposta

7

Trovato una soluzione. usando dojo.connect().

myDialog.connect(myDialog, "hide", function(e){ 
    dijit.byId("user_submit").destroy(); 
}); 

avrebbe postet questo poco dopo ho postato il quistion, ma non ho avuto abbastanza punti, ecco la risposta di nuovo, solo un po 'in ritardo :-)

+0

Grazie! Ha funzionato perfettamente! Per coloro che hanno cose nella finestra di dialogo, non dimenticare di aggiungere un 'dijit.byId (" user_submit "). DestroyDescendants();' !!!! – Superdrac

+1

Il metodo destroy consigliato è 'destroyRecursive' – JamieJag

3

IIRC, l'evento di estensione onClose viene chiamato quando fai clic sulla cosa X, quindi potresti provare a inserire il tuo codice di pulizia lì.


Si potrebbe anche considerare di aggirare il problema completamente. Forse non hai bisogno di distruggere il widget e potresti invece riutilizzare lo stesso? Puoi anche fare un test di esistenza del widget prima di crearlo nuovamente, distruggendo la vecchia versione se è ancora in vita.

+0

ho collegata alla manifestazione "nascondere" e che ha lavorato (poco dopo, ma non ho abbastanza punti per inviare una risposta così veloce alla mia domanda). Ma in effetti, quando ottimizzo la sceneggiatura, farei tutto ciò che hai detto. Ma dal momento che non sono nuovo a Dojo e il "progetto" doveva essere fatto velocemente, non avevo il tempo di pensare nella gestione delle risorse. –

+0

+1 per riutilizzare il dialogo dijit – jumpnett

-1

Quando si preme il X su la parte superiore della finestra di dialogo viene attivata l'evento "onCancel".

Smaltire l'elemento lì.

+1

" Lo sviluppatore non deve eseguire l'override o connettersi a questo metodo, è un dispositivo di comunicazione privato tra TooltipDialog e la cosa che lo ha aperto (es: dijit/form/DropDownButton) "- Documentazione dell'API Dojo https: // dojotoolkit.org/api /> Dijit> _DialogMixin> onCancel – GavinR

15

"Developer shouldn't override or connect to this method" per "onCancel", vedere documentation. Una soluzione migliore è:

var myDialog = new Dialog({ 
    id: "myDialogId1", 
    onHide: function() { 
     myDialog.destroy() 
    } 
}); 
+1

hai un link alla documentazione che potresti condividere con la persona che fa la domanda? –

+0

http://dojotoolkit.org/api/ Cerca dijit/Dialog e guarda il metodo di costruzione, passiamo params e srcNode – Superdrac

+1

Non funziona. Non c'è nemmeno la funzione hide() in dijit/Dialog.js. – peterh

1

È possibile ignorare onCancel() di quanto descritto sopra o è possibile collegare evento al dijit.dialog.closeButtonNode DOMElement. dijit.dialog.closeButtonNode è il nome dell'attributo data-dojo-attach-point per il pulsante di chiusura.

Exp:

dojo.on(dijit.Dialog.closeButtonNode, "click", function(evt){ 
     //add your logic here 
}); 
Problemi correlati