Bạn có ý tưởng đúng và Backbone sẽ giúp bạn dễ dàng hoàn thành công việc bằng cách sử dụng cùng một tổng quan cấp cao cơ bản về quy trình làm việc của bạn. Lưu ý rằng bạn vẫn sẽ sử dụng jQuery cho chức năng này - bạn sẽ chỉ làm việc đó thông qua các khía cạnh tổ chức của các loại Backbone.
Có một vài hạng mục quan trọng mà bạn sẽ muốn tại chỗ, hầu hết trong số đó bạn đã đề cập:
- Một xương sống Xem phối hợp các yếu tố HTML với mã Javascript của bạn
- Một xương sống mẫu để lưu trữ tất cả các dữ liệu mà người dùng nhập vào các phần tử HTML
- Một máy chủ back-end có thể xử lý các cuộc gọi JSON RESTful qua yêu cầu AJAX từ jQuery
tôi nghĩ rằng chỉ có điều bạn đang thiếu là mô hình có một phương pháp save
trên nó, mà kết thúc tốt đẹp tất cả các logic để gọi tạo/cập nhật các tuyến đường trên máy chủ back-end của bạn.Mô hình cũng có phương thức delete
để xử lý việc xóa khỏi máy chủ.
Là một ví dụ rất đơn giản, đây là biểu mẫu hiển thị mẫu HTML trên màn hình, thu thập thông tin nhập của người dùng vào mô hình và sau đó lưu nó vào máy chủ.
Một HTML template:
<script id="myTemplate" type="text/x-jquery-tmpl">
First name: <input id="first_name"><br/>
Last Name: <input id="last_name"><br/>
<button id="save">Save!</button>
</script>
mã để chạy này:
MyModel = Backbone.Model.extend({
urlRoot: "/myModel"
});
MyView = Backbone.View.extend({
template: "#myTemplate",
events: {
"change #first_name": "setFirstName",
"change #last_name: "setLastName",
"click #save": "save"
},
initialize: function(){
_.bindAll(this, "saveSuccess", "saveError");
},
setFirstName: function(e){
var val = $(e.currentTarget).val();
this.model.set({first_name: val});
},
setLastName: function(e){
var val = $(e.currentTarget).val();
this.model.set({last_name: val});
},
save: function(e){
e.preventDefault(); // prevent the button click from posting back to the server
this.model.save(null, {success: this.saveSuccess, error: this.saveError);
},
saveSuccess: function(model, response){
// do things here after a successful save to the server
},
saveError: function(model, response){
// do things here after a failed save to the server
},
render: function(){
var html = $(this.template).tmpl();
$(el).html(html);
}
});
myModel = new MyModel();
myView = new MyView({model: myModel});
myView.render();
$("#someDivOnMyPage").html(myView.el);
này sẽ cung cấp cho bạn một sự khởi đầu nhanh chóng cho một hình thức mà tiết kiệm một mô hình mới trở lại máy chủ.
Có một vài điều máy chủ của bạn cần phải làm:
- Return một mã phản hồi HTTP hợp lệ (200 hoặc một số phản ứng khác nói rằng tất cả mọi thứ là "ok")
- Return JSON đó là được gửi tới máy chủ, bao gồm mọi dữ liệu mà máy chủ được gán cho mô hình chẳng hạn như trường
id
.
Điều quan trọng là máy chủ của bạn thực hiện những việc này và bao gồm trường id
trong phản hồi. Nếu không có trường id
từ máy chủ, mô hình của bạn sẽ không bao giờ có thể tự cập nhật khi bạn gọi lại save
. Nó sẽ chỉ cố gắng tạo một cá thể mới trên máy chủ một lần nữa.
Đường trục sử dụng thuộc tính id
của một mô hình để xác định xem nó có nên tạo hoặc cập nhật mô hình khi đẩy dữ liệu vào đầu sau không. Sự khác biệt giữa việc tạo mô hình mới và lưu mô hình chỉ là thuộc tính id
. Bạn gọi save
trên mô hình cho dù đó là mô hình mới hoặc mô hình đã chỉnh sửa.
Xóa cũng hoạt động theo cách tương tự - bạn chỉ cần gọi destroy
trên mô hình và thực hiện cuộc gọi lại cho máy chủ để thực hiện việc hủy. Với một số HTML có liên kết hoặc nút "xóa", bạn sẽ đính kèm vào sự kiện nhấp chuột của phần tử HTML giống như tôi đã hiển thị cho nút "Lưu". Sau đó, trong phương thức gọi lại cho lần nhấp xóa, bạn sẽ gọi số this.model.destroy()
và chuyển bất kỳ thông số nào bạn muốn, chẳng hạn như gọi lại thành công và lỗi.
Lưu ý rằng tôi cũng bao gồm một số urlRoot
trên mô hình. Điều này, hoặc một chức năng url
là cần thiết trên một mô hình nếu mô hình không phải là một phần của một bộ sưu tập. Nếu mô hình là một phần của bộ sưu tập, bộ sưu tập phải chỉ định url
.
Tôi hy vọng rằng sẽ giúp.
Điều này giúp ích rất nhiều ... Cảm ơn bạn! –
Phương thức 'sync()' có liên quan gì đến 'save()' hay là các phương thức loại trừ lẫn nhau? –
Nó liên quan, vâng. Khi bạn gọi 'save', nó sẽ đại diện cho phương thức' sync'. Mặc định là sử dụng phương thức 'Backbone.sync'. Bạn có thể ghi đè điều này bằng cách cung cấp phương thức 'sync' trực tiếp trong định nghĩa mô hình của bạn. –