2011-08-27 13 views
5

Sono novizio in questo argomento. Ho div con alcuni widget dojo all'interno. Uso ajax per ricaricare questo div, ma dopo questo i miei widget dojo non vengono visualizzati. Come posso fare il mio browser per ricaricare nuovamente i widget dopo una richiesta Ajax. Non voglio ricaricare l'intera pagina.Ricarica widget dojo dopo richiesta Ajax

La mia opinione ajax parte:

<div dojoType="dijit.layout.BorderContainer" gutters="true" id="borderContainerTwo"> 
<?php foreach($wynik as $row): ?> 
    <div dojoType="dijit.layout.ContentPane" region="center" splitter="false"> 
     <p id="category"><img src="/photo/category/<?php echo $row->idPropozycji;?>.jpg" width="100" height="130" style="float: left;"></p> 
     <?php echo $row->opis; ?> 
    </div> 

    <div dojoType="dijit.layout.AccordionContainer" id="leftAccordion" region="leading" splitter="true"> 
     <div dojoType="dijit.layout.AccordionPane" title="Title"> 
      <h3><?php echo $row->nazwa2; ?></h3> 
     </div> 

     <div dojoType="dijit.layout.AccordionPane" title="Place"> 
      <?php echo $row->place;?> 
     </div> 

    </div>   
<?php endforeach;?> 
</div> 

Ricarica JQuery script:

// Functon to Show out Busy Div 
function showBusy(){ 
$('#ajax-content').block({ 
    message: '<h1>Wczytuje dane</h1>', 
    css: {border:'3px solid #FFF'} 
}); 
} 

function updatePage(html){ 

window.setTimeout(function(){ 
    $('#ajax-content').html(html); 
}, 2000) 


} 


$(document).ready(function() { 

// $.AJAX Example Request 
$('.ajax-pag > li a').live('click', function(eve){ 
    eve.preventDefault(); 

    var link = $(this).attr('href'); 
    console.log(link); 
    $.ajax({ 
     url: link, 
     type: "GET", 
     dataType: "html", 
     beforeSend: function(){ 
      showBusy(); 
     }, 
     success: function(html) { 
      updatePage(html); 
     } 
     }); 


});  


}); 
+0

Si consiglia di utilizzare solo un framework alla volta. Prendi in considerazione l'utilizzo di xhrGet e xhrPost per le richieste Ajax. Usi Firebug per il debug? Consiglio vivamente di usarlo. – perissf

risposta

9

Questo perché i widget nel frammento HTML tornato da server deve essere analizzato prima si può dimostrare in la pagina. Nella pagina principale, probabilmente avete un codice simile di seguito:

<script type="text/javascript" src="../javascripts/dojo1.6/dojo/dojo.js" 
djConfig="parseOnLoad: true"></script> 

La configurazione parseOnLoad: true significa dojo analizza l'intera pagina automaticamente dopo che la pagina viene caricata. Questo non è vero quando usi XHR per ottenere un altro frammento HTML dal server. In questo caso è necessario analizzare manualmente i widget.

Utilizzare la funzione dojo.parse.parse per analizzare un albero nodo DOM. Quindi ciò che devi fare è richiamare questa funzione dopo che il frammento HTML è stato aggiunto alla pagina. Ad esempio,

$('#ajax-content').html(html);  
dojo.parser.parse(dojo.byId('ajax-content')); 

Una cosa è necessario da notare è per assicurarsi che i widget sono state distrutte prima che la pagina viene nuovamente aggiornato per evitare perdita di memoria. La funzione dojo.parser.parse restituisce una matrice di tutti gli oggetti dei widget analizzati. Quindi, prima che la pagina venga aggiornata di nuovo, è possibile iterare questa matrice e distruggere questi widget.

//Save the last parsed result 
var widgets = dojo.parse.parse(); 

//Before update 
if (widgets) { 
    widgets.forEach(function(widget) { 
     widget.destroyRecursive(); 
    }); 
}