2012-01-16 40 views
16

Tôi đang cố tải JSON (từ json_encode của php) vào bộ sưu tập Backbone JS. Tôi đã đơn giản hóa vấn đề để:Xương sống: Tạo bộ sưu tập từ JSON

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]'; 

var myCollection = new MyCollection(myJSON, { view: this }); 

Và:

MyObject = Backbone.Model.extend({ 

    id: null, 
    name: null, 
    description: null 
}); 

MyCollection = Backbone.Collection.extend({ 
model: MyObject, 
initialize: function (models,options) { } 
}); 

Lỗi:

Uncaught TypeError: Cannot use 'in' operator to search for 'id' in

vấn đề tương tự: Backbone: fetch collection from server

JSON của tôi chắc chắn dường như là ở bên phải định dạng, tôi thiếu một cái gì đó hiển nhiên? Tôi đã thử sử dụng id đơn giản: "1" thay vì "id" với cùng một kết quả.

Trả lời

13

JSON của bạn vẫn là ở định dạng chuỗi. Chuyển nó đến JSON.parse trước khi chỉ định:

var myJSON = JSON.parse('[{"id":1,"name":"some name","description":"hmmm"}]'); 
+1

Đúng, và nếu dữ liệu được truy xuất bằng cách sử dụng phương thức $ .getJSON của jquery, nó sẽ tự động gọi JSON.parse trên đó. –

+1

Tài liệu hướng dẫn hiển thị truyền trực tiếp json tới khởi tạo trong ít nhất một ví dụ: http://documentcloud.github.com/backbone/#Collection-toJSON (mặc dù mục đích của bản trình diễn này là cách xuất json) – pws5068

+1

Lưu ý rằng họ không đề cập đến mảng mà họ truyền vào bộ dựng của bộ sưu tập đã được phân tích cú pháp. Tài liệu có thể có thể làm rõ một chút, nhưng điều cần nhớ là JSON thường được chuyển giữa máy chủ và máy khách ở định dạng chuỗi và cần được phân tích cú pháp sau khi nhận hoặc được xâu chuỗi trước khi gửi. – kinakuta

3

Bạn đã quên số băm defaults trong mô hình của mình.

MyObject = Backbone.Model.extend({ 
    defaults: { 
    id: null, 
    name: null, 
    description: null 
    } 
}); 

Xem documentation

+0

Ah, tôi đã quá tập trung vào ver ifying cấu trúc JSON tôi bỏ lỡ loại trừ đơn giản này. Cảm ơn sự giúp đỡ của bạn – pws5068

+3

mặc định băm là tùy chọn – kinakuta

+0

@kinakuta yep, giá trị mặc định băm là tùy chọn, nhưng mô hình trong ví dụ này đang cố sử dụng chức năng mặc định mà không có hàm băm. – Paul

0

vì vậy tôi có thể thiếu điểm hoàn toàn nhưng vấn đề có vẻ là 'dấu nháy đơn' xung quanh mảng. Đó là, này:

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]'; 

nên là:

var myJSON = [{ "id":"1","name":"some name","description":"hmmm"}]; 

Php, Afik, không thêm dấu nháy đơn, vì vậy nó nên càng đơn giản như thay đổi một dòng nói rằng:

$my_js = "var myJSON = '" . json_encode($my_array_to_send)) . "';"; 

tới:

$my_js = "var myJSON = " . json_encode($my_array_to_send)) . "; "; 
Các vấn đề liên quan