我开始构建一个新的应用程序,我想使用Backbone作为我的框架。以下是此(以及大多数应用)遵循的基本工作流程。
Backbone使用的正确/最佳模型是什么?
旧方式
用户导航到页面
选择“创建新窗口小部件”
向用户显示填写输入的表格
此时我可能会输入所输入的值(在通过基本验证之后),将它们打包并通过ajax请求将它们发送到服务器
请求返回为“OK”,用户被带到其他地方(此步骤并不完全重要)
一些基本的伪代码
// Grab values
var userName = $('.UserName').val(),
dateOfBirth = $('.DateOfBirth').val();
...
...
...
$.ajax({
url: "/Webservices/ProcessStuff",
success: function(result){
if (result) {
// Render something or doing something else
} else {
// Error message
}
},
error: function () {
// Error message
}
});
骨干方式
使用与上面相同的例子;我假设我有一个用户信息模型和一个显示输入的视图。但是,处理对Web服务的实际调用是我感到困惑的事情之一。这需要去哪里?在模型中或某个“开始”按钮的click
视图中?
Model.UserInformation = Backbone.Model.extend({ username: null, dateOfBirth: null });
也许还有这些UserInformation模型的集合?
UserInformations = Backbone.Collection.extend({ model: Model.UserInformation' });
所以我要问的底线是......
实现此功能的最佳方法是什么?
实际执行CRUD的正确方法是什么?在哪里把实际的调用放到delete / update / create / etc?
答案 0 :(得分:12)
您有正确的想法,Backbone应该可以让您使用工作流程的相同基本高级概述轻松完成工作。请注意,您仍将使用jQuery来实现此功能 - 您只需通过Backbone类型的组织方面进行此操作。
您需要的几个关键项目,大多数已经提到过:
我认为你唯一缺少的是模型上有一个save
方法,它包含了调用后端服务器上的创建/更新路由的所有逻辑。该模型还有一个delete
方法来处理从服务器删除。
作为一个非常简单的示例,这是一个将HTML模板呈现到屏幕的表单,将用户输入收集到模型中,然后将其保存到服务器。
HTML模板:
<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>
运行此代码的代码:
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);
这将为您快速启动将新模型保存回服务器的表单。
您的服务器需要做一些事情:
id
字段。您的服务器执行这些操作并在响应中包含id
字段非常重要。如果服务器中没有id
字段,当您再次调用save
时,您的模型将永远无法自行更新。它只会尝试再次在服务器上创建一个新实例。
Backbone使用模型的id
属性来确定在将数据推送到后端时是否应创建或更新模型。创建新模型和保存模型之间的区别仅在于id
属性。您可以在模型上调用save
,无论是新模型还是已编辑模型。
删除工作方式相同 - 您只需在模型上调用destroy
,然后回调服务器进行销毁。对于某些带有“删除”链接或按钮的HTML,您将附加到该HTML元素的click事件,就像我为“保存”按钮所示。然后在删除单击的回调方法中,您将调用this.model.destroy()
并传递您想要的任何参数,例如成功和错误回调。
请注意,我还在模型中添加了urlRoot
。如果模型不是集合的一部分,则需要在模型上使用此函数或url
函数。如果模型是集合的一部分,则集合必须指定url
。
我希望有所帮助。
答案 1 :(得分:0)
如果视图的“el”是表单标记,那么您可以使用内置事件对象绑定要提交的函数,但如果视图的根是其他内容,那么您需要在渲染函数中附加单击处理程序。