Перезагрузка виджетов Dojo после запроса AJAX - PullRequest
5 голосов
/ 27 августа 2011

Я новичок в этой теме. У меня есть div с некоторыми виджетами додзё внутри. Я использую ajax для перезагрузки этого div, но после этого мои виджеты dojo не отображаются Как я могу сделать мой браузер, чтобы перезагрузить виджеты снова после запроса AJAX. Я не хочу перезагружать всю страницу.

Моя часть просмотра ajax:

<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>

Перезагрузить скрипт JQuery:

// 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);
        }
        });


 });    


 });

1 Ответ

9 голосов
/ 29 августа 2011

Это связано с тем, что виджеты во фрагменте HTML, возвращенном с сервера, должны быть проанализированы в первую очередь, прежде чем их можно будет отобразить на странице.На главной странице у вас, вероятно, есть код, подобный приведенному ниже:

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

Конфигурация parseOnLoad: true означает, что dojo автоматически анализирует всю страницу после загрузки страницы.Это не так, когда вы используете XHR для получения другого HTML-фрагмента с сервера.В этом случае вам необходимо проанализировать виджеты вручную.

Используйте функцию dojo.parse.parse для анализа дерева узлов DOM.Поэтому вам нужно вызвать эту функцию после добавления фрагмента HTML на страницу.Например,

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

Одна вещь, которую вам нужно отметить, это убедиться, что виджеты были уничтожены до того, как страница обновится снова, чтобы избежать утечки памяти.dojo.parser.parse функция возвращает массив объекта всех проанализированных виджетов.Поэтому перед повторным обновлением страницы вы можете выполнить итерацию этого массива и уничтожить эти виджеты.

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

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