我开始构建一个新的应用程序,我想使用 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
}
});
主干方式
使用与上述相同的示例;我假设我有一个用户信息模型和一个显示输入的 View 。但是,处理对 Web 服务的实际调用是我感到困惑的事情之一。这需要去哪里?在模型或 View 中 click 某个“Go”按钮?
Model.UserInformation = Backbone.Model.extend({ username: null, dateOfBirth: null });
也许还有这些 UserInformation 模型的集合?
UserInformations = Backbone.Collection.extend({ model: Model.UserInformation' });
所以我要问的底线是...
实现此功能的最佳方法是什么?
实际执行 CRUD 的正确方法是什么?将删除/更新/创建/等的实际调用放在哪里?
最佳答案
您的想法是正确的,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 元素的单击事件,就像我为“保存”按钮显示的一样。然后在删除点击的回调方法中,您将调用 this.model.destroy() 并传递您想要的任何参数,例如成功和错误回调。
请注意,我还在模型中包含了一个 urlRoot。如果模型不是集合的一部分,则模型需要此函数或 url 函数。如果模型是集合的一部分,则集合必须指定 url。
希望对您有所帮助。
关于javascript - 使我的旧工作流程适应 Backbone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7716011/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我