2013-06-04 18 views
12

Tôi đang cố gắng điền một JSTree với dữ liệu JSON mà tôi nhận được từ một dịch vụ (được gọi là sử dụng ajax). Tuy nhiên, tôi nhận được thông báo "Không có dữ liệu và cài đặt ajax được cung cấp lỗi" trong tệp jquery.jstree.js. Bởi vì điều này JSTree chỉ hiển thị một gif tải.Populating một JSTree với dữ liệu JSON thu được trong AJAX

AJAX mã (ngồi biên tập để thử thiết json để kiểm tra biến địa phương, sau đó trở về thử nghiệm)

function getJSONData() { 
    var test; 
    $ 
      .ajax({ 
       async : true, 
       type : "GET", 
       url : "/JavaTestService/rs/TestService/MyFirstTestService?languageCode=en_US&version=2", 
       dataType : "json", 

       success : function(json) { 
        test = json; 
       }, 

       error : function(xhr, ajaxOptions, thrownError) { 
        alert(xhr.status); 
        alert(thrownError); 
        test = "error"; 
       } 
      }); 
    return test; 
} 

đang JSTree

var jsonData = getJSONData(); 
createJSTrees(jsonData); 

function createJSTrees(jsonData) { 
     $("#supplierResults").jstree({ 
      "json_data" : { 
       "data" : jsonData 
      }, 
      "plugins" : [ "themes", "json_data", "ui" ] 
     }); 

Sau khi một số lỗi, tôi đã phát hiện ra rằng jsonData không được xác định khi được chuyển tới phương thức createJSTrees. Tôi có lấy đúng dữ liệu đó trong mã Ajax không? Cảm ơn trước

+1

Bạn cần phải đặt async trở lại "false" cho phương pháp biến cục bộ này hoạt động. – Adam

Trả lời

1

Tôi chưa thử nghiệm cách tiếp cận của bạn trước đây, nơi bạn cung cấp thông số dữ liệu trực tiếp cho plugin json_data, vì vậy tôi sẽ không thể cung cấp câu trả lời cho trường hợp này.

Tuy nhiên, vì bạn đang sử dụng cuộc gọi AJAX để nhận dữ liệu, bạn có thể cung cấp lời gọi AJAX cho JSTree và để cho nó tự xử lý cuộc gọi không? Dưới đây là cách tôi đã định cấu hình cuộc gọi AJAX trong mã của mình:

 (...) 
     'json_data': { 
      'ajax': { 
       'url': myURL, 
       'type': 'GET', 
       'data': function(node) { 
        return { 
         'nodeId': node.attr ? node.attr("id") : '' 
        }; 
       } 
      }, 
      'progressive_render': true, 
      'progressive_unload': false 
     }, 
     (...) 
+0

Khi tôi thử phương pháp này, tôi nhận được lỗi sau: POST http: // localhost: 8081/JavaTestService/rs/TestService/MyFirstTestService? LanguageCode = en_US & version = 2 405 (Phương thức không được phép). Bất kỳ ý tưởng về lý do tại sao điều này có thể? –

+0

Bạn có thể thay đổi thông số loại trong mã ở trên từ 'POST' thành 'GET' không? Điều đó sẽ làm các trick. Tôi đã cập nhật mã cho phù hợp. – vincentks

+0

Tôi nghĩ rằng có thể đã được nó. Hiện không có lỗi giao diện điều khiển nào, nhưng JSTree của tôi hoàn toàn trống. Đó là trường hợp tương tự khi tôi thử cách tiếp cận được mô tả bởi Adam bên dưới. Bằng cách nào đó tôi không nhận được dữ liệu đúng. Nếu bạn biết mã trên là chắc chắn, tôi sẽ chỉ tiếp tục tìm kiếm ở nơi khác trong đơn đăng ký của tôi vì lý do này. –

6

jsonData không được xác định vì getJSONData() không trả về giá trị. Bạn không thể dựa vào giá trị trả về từ trình xử lý thành công $ .ajax của bạn trừ khi bạn gán một biến cục bộ cho getJSONData() được trả về sau khi cuộc gọi $ .ajax hoàn thành. Nhưng bạn muốn một cái gì đó như thế này, mà cũng có lợi ích là không đồng bộ:

<script type="text/javascript">  

$(function() { 
    $.ajax({ 
     async : true, 
     type : "GET", 
     url : "/JavaTestService/rs/TestService/MyFirstTestService?languageCode=en_US&version=2", 
     dataType : "json",  

     success : function(json) { 
      createJSTrees(json); 
     },  

     error : function(xhr, ajaxOptions, thrownError) { 
      alert(xhr.status); 
      alert(thrownError); 
     } 
    }); 
});  

function createJSTrees(jsonData) { 
    $("#supplierResults").jstree({ 
     "json_data" : { 
      "data" : jsonData 
     }, 
     "plugins" : [ "themes", "json_data", "ui" ] 
    }); 
}  

</script> 
+0

Tôi đã thực hiện phương pháp trên, nhưng JSTree của tôi hoàn toàn trống (không phải ngay cả một gif tải). Tôi không nhận được bất kỳ lỗi giao diện điều khiển nào, vì vậy tôi đoán rằng dữ liệu json có thể trống? Đó không phải là trường hợp mặc dù, như tôi đã thử nghiệm dịch vụ. –

+1

Tôi không quen với jsTree, nhưng đoạn mã trên sẽ đảm bảo createJSTrees (jsonData) được gọi với phản hồi JSON từ dịch vụ của bạn. JsonData trông như thế nào khi hàm đó được thực thi? – Adam

+0

Sau khi thêm biến cục bộ vào getJSONData(), jsonData vẫn chưa được xác định. Mã AJAX đã chỉnh sửa nằm trong bài đăng chính của tôi. Kiểm tra biến không được xác định sau cuộc gọi AJAX. –