2010-08-07 34 views
25

Tôi đang cố gắng sử dụng jQuery để gọi một số API tùy chỉnh qua số Ajax/$.getJSON.

Tôi đang cố gắng chuyển giá trị tùy chỉnh vào phương thức gọi lại Ajax, nhưng giá trị đó không được chuyển qua và thực sự bị ghi đè. Đây là mã của tôi:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 

$("#loading_status").show(); 

$.getJSON(url, null, function(results, locationType) { 
    searchResults(results, locationType) 
}); 

Giá trị của locationType TRƯỚC tôi gọi là URL sử dụng AJAX là 3. Nhưng sau khi cuộc gọi trả về dữ liệu thành công, giá trị cho locationType hiện là success. Điều này là do method signature of the callback là:

callback (dữ liệu, textStatus) Một callback chức năng đó được thực hiện nếu yêu cầu thành công.

Làm cách nào để chuyển 1 hoặc nhiều tham số cho phương thức gọi lại?

+0

biến locationType là biến toàn cầu, do đó bạn không cần phải đặt nó như là tham số, trong hàm callback anonimus rằng biến là miễn phí nên nó là tìm kiếm trong môi trường xung quanh mà trong trường hợp này là môi trường toàn cầu. – jcubic

+1

@jcubic - Nó không phải là biến * global * (có thể là, nhưng có lẽ không), chính xác hơn nó có sẵn trong phạm vi mà anh ta quan tâm. –

Trả lời

19

Bạn không cần phải vượt qua nó, chỉ cần tham khảo các biến bạn đã có, như thế này:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 
$("#loading_status").show(); 
$.getJSON(url, null, function(results) { 
    searchResults(results, locationType) 
}); 

Cũng không cần để vượt qua null nếu bạn không có một đối tượng dữ liệu, đó là một tham số tùy chọn và kiểm tra jQuery nếu param thứ hai là một chức năng hay không, vì vậy bạn chỉ có thể làm điều này:

$.getJSON(url, function(results) { 
    searchResults(results, locationType) 
}); 
+17

Bạn phải cẩn thận với điều này. Đối với biến giá trị cố định, điều này hữu ích, nhưng nếu bạn cố gắng làm điều này, ví dụ, bên trong một vòng lặp nơi locationType là chỉ mục, giá trị của nó bên trong hàm gọi lại sẽ là giá trị tại thời điểm thực thi gọi lại, không phải giá trị tại Định nghĩa. Chỉ trong trường hợp! –

+0

@DanibISHOP: Và làm thế nào bạn sẽ vượt qua một giá trị cố định không? – Espen

+0

giá trị không cố định có thể hữu ích nếu bạn thực hiện nhiều cuộc gọi API và sau đó vẫn cần phải biết cuộc gọi nào bắt nguồn từ ID bạn đang tải – mitchken

2

Nếu bạn muốn sử dụng locationType (có giá trị là 3) trong gọi lại, chỉ cần sử dụng

function(results) { ..... 

nhờ closures, locationType sẽ tự động xuất hiện trong callback.

18

Làm cong trong một hàm, ví dụ:

function getResults(locationType) { 
    $.getJSON(url, null, function(results) { 
     searchResults(results, locationType) 
    }); 
} 

Nhưng trong trường hợp cụ thể bạn thậm chí không cần phải vượt qua nó, bạn có thể truy cập trực tiếp giá trị trong cuộc gọi lại.

+3

nếu bạn đang làm một vòng lặp và gọi $ .getJSON() mỗi lần, sau đó gói nó một hàm sẽ giữ nguyên biến; nếu không, nó sẽ bị ghi đè. – yee379

3

bạn có thể sử dụng phương pháp .ajax:

var locationType = 3; 
var url = 'blah blah blah' + '&locationType=' + locationType; 
$.ajax({ 
    url: url, 
    context: { lt: locationType }, 
    success: function(results) { 
     searchResults(results, this.lt);  
    } 
}); 
+0

Tôi tin rằng có lỗi trong mã ở trên. Khi sử dụng thiết lập ngữ cảnh, "điều này" trở thành ngữ cảnh trong hàm gọi lại, vì vậy mã nên đọc các kết quả tìm kiếm (kết quả, this.lt); thay vì searchResults (kết quả, this.context.lt) ;. Tôi đã thực hiện chỉnh sửa ở trên. –

0

thể thử:

function getResults(locationType) { 
    $.getJSON(url, {p1:'xxx', p2: 'yyy'}, function(results) { 
     searchResults(results, locationType) 
    }); 
} 
Các vấn đề liên quan