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?
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
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