2013-06-06 25 views
8

Xin chào các trụ cột Backbone,Lỗi đồng bộ xương sống ngay cả sau mã phản hồi 200

Đây là lần đầu tiên tôi sử dụng Backbone - vì vậy vui lòng giải thích "noob" của tôi. Trong chức năng của tôi (một phần của một ứng dụng lớn hơn), tôi có một Backbone View vA, được hỗ trợ bởi một mô hình mA (như nó phải) và phía máy chủ là trong Spring MVC có các phương thức điều khiển Spring có chú thích với @RequestBody và @ResponseBody. Tôi đã có Jackson làm việc tốt với Spring.

Bây giờ, trong ứng dụng,

Backbone.Model 
|_ BaseModel (custom base model for our app) 
    |_ mA (my model) 

mA có thiết bị đầu cuối của mình và nó Backbone thành công các cuộc gọi mà khi thực hiện một yêu cầu PUT tức là, khi tôi gọi tiết kiệm() từ một nút gửi xử lý sự kiện từ Xem vA như vậy:

this.model.save ({

  success : function(){ 

        alert('Request submitted successfully'); 


      }, 

      error : function(){ 
       alert('Something awful happened.'); 
      } 

});

BaseModel chúng tôi có như sau:

define([], function() { 



window.BaseModel = Backbone.Model.extend({ 
...... 


}); 

onSyncError : function(model, response) { 
     switch (response.status) { 
     case 403: 
     [...//some more code ] 
     default: 
      alert(bundle.getDefault('HTTP_RESP_OTH') + response.status); 
     } 
    }, 

    onSyncSuccess : function(model, response) { 
     alert('Sync done! '); 
    }, 

    sync : function(method, model, options) { 
     options.error = this.onSyncError; 
     Backbone.sync.call(this, method, model, options); 
     ....//some more stuff.  
    }, 

} 

Xuân Phương pháp điều khiển:

@RequestMapping(value="/resource/xyz/{id}.json", method = RequestMethod.PUT, consumes  = {"application/json"} 
, produces = {"application/json"}) 
@ResponseBody 
public Map<String,String> methodX(@RequestBody XyzDTO xyzDTO){ 
.... 
map.put("msg", "success"); 

return map; 
} 

Ngoài ra, ngay trước khi tôi làm cho tiết kiệm gọi, tôi sửa đổi một vài mẫu thuộc tính, kể từ khi DTO phía máy chủ có cấu trúc khác nhau như vậy:

this.model.unset("abc",{ silent: true }); 
this.model.set({ abc: {id : "2",xyz:{ ... //more code }); 

Vấn đề là, gọi save() tạo ra một PUT yêu cầu và gọi thành công trình xử lý điểm cuối Spring, nhưng tôi nhận được mã phản hồi 200 (đó là những gì tôi mong đợi), nhưng khi tôi theo dõi cuộc gọi bằng Firebug, nó đi vào phương thức onSyncError và cung cấp cho tôi thông báo lỗi (vì trường hợp "mặc định" trong đó).

Nguyên tắc Backbone nói: "Khi trả về phản hồi JSON, hãy gửi các thuộc tính của mô hình đã được máy chủ thay đổi và cần được cập nhật trên máy khách". Vâng, tôi không cần phải cập nhật mô hình ở phía máy khách, một trong những màn hình cuối cùng và tôi chỉ cần thông báo cho người dùng về thành công/lỗi và chuyển hướng anh ta đến trang chính/trang tổng quan.

Tôi đọc thêm một số thứ khác và có vẻ như mã 200 là phản hồi là không đủ - có thể có lỗi phân tích cú pháp JSON khiến đồng bộ hóa không thành công.

Tôi đã kiểm tra phản hồi trong Firebug và phản hồi JSON trông giống như {"msg": "Success"}.

Vì vậy, điều gì có thể xảy ra?

+1

Tôi không chắc chắn nếu điều này sẽ gây ra vấn đề của bạn, nhưng tôi đã gặp khó khăn trước với thực tế rằng 'Backbone .Model.save() 'thực sự yêu cầu bạn đặt dữ liệu lưu của bạn làm đối số đầu tiên, như sau:' model.save (model.toJSON(), {success: function() {}, error: function() {}); Tôi đã gặp vấn đề với điều này trong quá khứ, nơi tôi gặp lỗi lạ chỉ vì tôi quên rằng bạn phải chuyển rõ ràng trong dữ liệu bạn muốn lưu/đăng. Có thể cung cấp cho một thử. – brettjonesdev

+0

Cảm ơn bạn đã dành thời gian. Nhưng nó không giúp được gì. Bây giờ, tôi nhận được điều này trong Firebug khi trả lời trả về: TypeError: a is undefined ... function bi (a, b, d) {var e = b.dir, f = d && b.dir === "parentNode", g = u ++; ... – trishulpani

Trả lời

1

Cảm ơn thời gian của bạn.Cuối cùng, tôi đã có thể giải quyết vấn đề bằng cách sử dụng $ .ajax để thực hiện yêu cầu PUT, do đó bỏ qua toàn bộ điều khiển đồng bộ Backbone. Trình xử lý thành công của tôi trong cuộc gọi lại ajax xử lý phản hồi và không còn lỗi đồng bộ hóa nữa (vì nó không được gọi là anyways) :)

+0

Không thành vấn đề. Tôi không chắc chắn rằng ốp các vấn đề bằng cách gọi trực tiếp $ .ajax là giải pháp tốt nhất, nhưng bất cứ điều gì làm việc cho bạn. Bạn cũng có thể xem [chủ đề này] (http://stackoverflow.com/questions/6394108/how-should-server-respond-to-backbone-sync?rq=1) để trả lời câu hỏi về cách Máy chủ phản hồi 'model.save()'. – brettjonesdev

9

Backbone.Model.save() hy vọng phản hồi từ máy chủ là băm được cập nhật của các giá trị của mô hình. Nếu phản hồi của bạn thuộc loại {"msg":"Success"}, Đường trục có thể không đồng bộ hóa với kiểu máy của bạn. Về cơ bản, nó diễn giải phản hồi JSON HTTP 200 của bạn dưới dạng thuộc tính của mô hình và cố gắng đồng bộ hóa mô hình cho phù hợp.

Bạn có thể thử 1) Làm đường dẫn bộ điều khiển lò xo trả về phản hồi mô hình JSON-ified, 2) Trả về một đồng bằng 200 với nội dung phản hồi trống hoặc 3) viết phương thức tùy chỉnh parse để tìm câu trả lời với định dạng {"msg":"Success"} và phản ứng khác nhau.

+3

một cơ thể đáp ứng trống sẽ vẫn gọi trình xử lý lỗi, phản hồi của ''{}'' sẽ không mặc dù – robertjlooby

0

Tôi sẽ chia sẻ kinh nghiệm của mình với cùng một vấn đề; mô hình cơ sở tùy chỉnh và gọi mô hình.save và không có sự kiện thành công nào được kích hoạt.

Sự cố của tôi là với chức năng đặt tùy chỉnh trong mô hình cơ sở không trả về "điều này".

Nếu bạn peek vào mã nguồn xương sống cho mô hình lưu bạn sẽ thấy đoạn mã này:

options.success = function(resp) { 
    // Ensure attributes are restored during synchronous saves. 
    model.attributes = attributes; 
    var serverAttrs = model.parse(resp, options); 
    if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 
    if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 
     return false; 
    } 
    if (success) success(model, resp, options); 

    model.trigger('sync', model, resp, options); 
    }; 

Các model.set (serverAttrs, options) thất bại trong trường hợp của tôi và tiết kiệm năng trở lại sai trước khi kích hoạt bất kỳ sự kiện nào.

Có lẽ đây không phải là vấn đề của bạn nhưng hy vọng nó sẽ giúp ai đó ngoài kia ...

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