2011-10-20 2 views
11

Với backbone.js tôi đang lưu mô hình. Một PUT được gửi đến máy chủ và phản hồi được trả về. Lần đầu tiên tôi làm điều đó, nó trả về thành công, những lần sau một lỗi được trả về, bởi vì sau lần đầu tiên câu trả lời được thêm vào mô hình.Cách nhận phản hồi tốt từ việc lưu mô hình

Lưu hàm trong Backbone.js:

saveCountry: function() { 
    this.model.save({},{ 
     success: function(model, response) { 
      console.log('success! ' + response); 
     }, 
     error: function(model, response) { 
      console.log('error! ' + response); 
     } 
    }); 
    this.render(); 

    return false; 
}, 

PHP trả về một JSON-chuỗi:

{"response": "Model saved!"} 

Sau PUT của nhận được một lỗi như phản ứng, bởi vì 'phản ứng' được thêm vào mô hình:

Unknown column 'response' in 'field list' 

Tại sao phản hồi được thêm vào mô hình và làm cách nào để ngăn chặn mô hình?

+0

Bạn không thể chỉ thực hiện điều kiện và bỏ qua 'phản hồi' trong tập lệnh php của mình? – swatkins

+0

Tôi có thể, nhưng tôi nghĩ rằng nó sẽ được sạch hơn để cho phía máy chủ quyết định phản ứng. – GijsjanB

+0

Bạn có nghĩa là "khách hàng" phụ? – swatkins

Trả lời

7

Từ tài liệu Backbone của trên mô hình save:

Đặt một hash của mô hình thuộc tính, và đồng bộ hóa các mô hình đến máy chủ. Nếu máy chủ trả về băm thuộc tính khác, trạng thái của mô hình sẽ được đặt lại. http://documentcloud.github.com/backbone/docs/backbone.html#section-41

Phải làm gì để làm cho nó hoạt động: không trả lại {"phản hồi": "Mô hình đã lưu!"} Từ máy chủ. Chỉ cần trả lại thành công (trạng thái 200) không có nội dung.

Nếu lưu không hoạt động, trả lại JSON có lỗi và Backbone sẽ kích hoạt sự kiện lỗi trên mô hình của bạn, với JSON bạn đã cung cấp (xem http://documentcloud.github.com/backbone/docs/backbone.html#section-41http://documentcloud.github.com/backbone/docs/backbone.html#section-145).

6

Chỉ cần hồi sinh chuỗi cũ ...

Không phải lúc nào cũng có thể/mong muốn thay đổi phản hồi bạn nhận được từ máy chủ.

Một giải pháp khác là ghi đè parse trong mô hình để xử lý việc này. Đối với trường hợp của bạn, nơi mà câu trả lời là không phù hợp cho TẤT CẢ các mô hình của bạn, bạn có thể làm điều đó trong một siêu lớp.

MyModel = Backbone.Model.extend({ 
    parse: function(data) { 
     delete data["success"]; 
     return data; 
    } 
}); 

Address = MyModel.extend({ 
    saveCountry: function() { 
     this.model.save({},{ 
      success: function(model, response) { 
       console.log('success! ' + response); 
      }, 
      error: function(model, response) { 
       console.log('error! ' + response); 
      } 
     }); 
     this.render(); 

     return false; 
    }, 

    ... 

});