2012-05-08 41 views
9

Tôi đã thử backbone.js và đã bị cản trở khi tạo một đối tượng mô hình mới rồi gọi model.save(). Tôi đang mong đợi hành vi mặc định backbone.js để cập nhật đối tượng mô hình với id từ cơ sở dữ liệu nhưng nó không phải là. Đây có phải là điều không nên xảy ra? Tôi đã xác minh rằng tôi đang nhận được một bài đăng với các thuộc tính ở định dạng json. Máy chủ của tôi lưu json vào một bảng và sau đó trả về json với một trường id mới là backbone.js. Điều này có đúng không? Máy chủ của tôi có nên trả lại toàn bộ đối tượng mới hay chỉ là id hoặc cái gì?backbone.js không cập nhật id của đối tượng mô hình sau khi lưu, tại sao không?

//contents of the POST from backbone.js 
    { "text":"this is a test" } 

//reply from my server 
    { id:"15", text:"this is a test" } 

mẫu mã của tôi là dưới

var SQLRow = Backbone.Model.extend({ 
table:"", 
urlRoot:'db', 
url:function() { 
    return "/" + this.urlRoot + "?table=" + this.table + 
       "&id=" + this.attributes.id; 
    } 
}); 

var Xtra = SQLRow.extend ({ 
    table:'Xtra' 
}); 

var row = new Xtra({ 
    text: "this is a test" 
}); 

alert(row.url()); 
row.save() 
alert("row:" + row.get("id")); 
+0

Phản hồi trông như thế nào được trả lại từ cuộc gọi lưu? – kinakuta

Trả lời

6

Tough kể từ bài viết của bạn. Hai ý tưởng:

1) phản hồi từ máy chủ không thành công Cuộc gọi tiết kiệm của bạn sẽ trở lại như thế nào?

2) Thuộc tính "id" của bạn được đặt tên khác với ID. Để giải thích cho những cái tên khác thêm dòng sau vào mô hình của bạn:

idAttribute : "MyModelsID", 

EDIT

Bạn đang có khả năng phải đối mặt với một vấn đề thời gian, nơi mà các vụ cháy cảnh báo trước khi ID đã trở lại. Thay vì hai dòng cuối cùng của bạn thử điều này:

row.save(null, 
       { 
       success : function(model, response) { alert(model.get('id'); } 
       } 
     ); 

THAY THẾ

Như @mu_is_too_short đã đề cập, một cách khác là để lắng nghe cho sự thay đổi ngay cả trên các mô hình và ứng phó với sự kiện này. (tôi đã cố gắng giữ câu trả lời càng gần mã của bạn càng tốt). Nhưng giống như sau mã giả nên giúp bạn bắt đầu ...

var myView = Backbone.View.extend({ 
      .... 
      initialize : function() { 
       this.collection.bind('change', this.SOME_LISTENING_FUNC ); 

      } 
    }); 

OR, nếu bạn đang ở trong một bộ sưu tập/xem ít cái gì đó trên thế giới như thế này sẽ tạo ra một listenr ...

row.on('change', function() { /* do stuff */ }, this);    
+1

Hoặc liên kết trình xử lý '" thay đổi "' với mô hình và nhận kết quả của 'lưu' theo cách đó. Backbone là một khung điều khiển sự kiện, cố gắng kết hợp nó thành một mô hình nối tiếp không hoạt động tốt (phần này chủ yếu dành cho Cjolly). –

+0

@muistooshort - vì vậy chúng tôi gặp lại moo. Cảm ơn bạn đã thay thế, tôi kết hợp một số mã giả vào câu trả lời. – EBarr

+3

Có hai vấn đề với mã. Đầu tiên, định dạng json được máy chủ trả về cũng cần các khóa của các thuộc tính được trích dẫn (tức là. {Id: "axe"} thực sự phải là {"id": "axe"}. Sau khi tôi thực hiện thay đổi đó, tôi đã kinh doanh; , cảnh báo của tôi ngay lập tức sau khi lưu sẽ có khả năng không bao giờ hiển thị bản chất thực sự của đối tượng khi lưu là cuộc gọi ajax không đồng bộ và chúng tôi sẽ luôn nhận được cảnh báo trước khi xử lý ajax và backbone.js hoàn tất. mu là ngắn ** ở trên cho thấy là cách chính xác để đi: – Cjolly

1

Câu trả lời này dựa trên một nhận xét của Cjolly trong câu trả lời ở trên. Cần phải thực hiện Backbone.Model.save([attributes],[options]) thành công trong việc xác định mô hình với id của mô hình mới được tạo ra từ máy chủ, máy chủ trả về id của mô hình trong một chuỗi JSON như thế này { "id" : <the id> }. (lưu ý rằng nó là "id" và không phải là id).

Trong xương sống bản chất một cách đúng đắn sẽ là một chuỗi JSON và ngược lại với cách đối tượng có thể được định nghĩa trong Javascript mà không cần phím trích dẫn, JSON đòi hỏi các phím đối tượng được trích dẫn (xem JSON Spec - does the key have to be surrounded with quotes?)

Kể từ khi theo bình luận Cjolly của đây là vấn đề quan trọng, tôi muốn làm sáng tỏ giải pháp này trong câu trả lời thứ hai. Một phần bởi vì tôi đã bị tấn công bởi cùng một vấn đề và chỉ bằng cách đọc througth các ý kiến ​​tôi đã có thể nhận được cái nhìn sâu sắc.

0

Tôi đã gặp phải vấn đề tương tự và những gì tôi thấy là chức năng validate của mô hình đã lưu thực sự làm mất hiệu lực mô hình được trả lại từ đầu sau. Đó là lý do tại sao các trường của tôi không được cập nhật đúng cách.

0

Có thể một chút được đánh giá cao, nhưng hôm nay tôi có cùng id bị thiếu. Hóa ra, máy chủ chỉ gửi Tiêu đề 'Vị trí' với một chuyển hướng chứa id mới, nhưng không trả lại đối tượng đã tồn tại. Thêm đối tượng vào phản hồi là giải pháp. Dường như, không trả về đối tượng là hành vi tiêu chuẩn với Roo (Spring) đã tạo ra Json-Controllers.

Các vấn đề liên quan