2011-08-27 36 views
5

Tôi là người mới trong chủ đề này. Tôi có div với một số vật dụng dojo bên trong. Tôi sử dụng ajax để tải lại div này, nhưng sau này widget dojo của tôi không hiển thị. Làm thế nào tôi có thể làm cho trình duyệt của tôi để tải lại các vật dụng một lần nữa sau khi yêu cầu ajax. Tôi không muốn tải lại toàn bộ trang.Tải lại tiện ích dojo sau yêu cầu ajax

My xem phần 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> 

Nạp lại JQuery kịch bản:

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

Tôi khuyên bạn chỉ nên sử dụng một khung ở một thời điểm. Xem xét sử dụng xhrGet và xhrPost cho các yêu cầu Ajax. Bạn có sử dụng Firebug để gỡ lỗi không? Tôi khuyên bạn nên sử dụng nó. – perissf

Trả lời

9

Điều này là do các vật dụng trong đoạn HTML trở về từ máy chủ cần phải được phân tích đầu tiên trước khi nó có thể được thể hiện trong trang. Trong trang chính của bạn, có thể bạn có mã như sau:

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

Cấu hình parseOnLoad: true có nghĩa là dojo phân tích toàn bộ trang tự động sau khi tải trang. Điều này không đúng khi bạn sử dụng XHR để nhận một đoạn HTML khác từ máy chủ. Bạn cần phải phân tích cú pháp các tiện ích theo cách thủ công trong trường hợp này.

Sử dụng chức năng dojo.parse.parse để phân tích cú pháp cây nút DOM. Vì vậy, những gì bạn cần làm là gọi hàm này sau khi đoạn HTML được thêm vào trang. Ví dụ:

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

Một điều bạn cần lưu ý là đảm bảo tiện ích đã bị hủy trước khi trang được cập nhật lại để tránh rò rỉ bộ nhớ. Hàm dojo.parser.parse trả về một mảng của tất cả đối tượng tiện ích được phân tích cú pháp. Vì vậy, trước khi trang được cập nhật một lần nữa, bạn có thể lặp mảng này và phá hủy các tiện ích này.

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

//Before update 
if (widgets) { 
    widgets.forEach(function(widget) { 
     widget.destroyRecursive(); 
    }); 
} 
Các vấn đề liên quan