草庐IT

javascript - 使我的旧工作流程适应 Backbone

coder 2024-07-23 原文

我开始构建一个新的应用程序,我想使用 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 类型的组织方面来实现。

您需要准备几个关键项目,其中大部分您已经提到:

  • 主干 View ,用于协调 HTML 元素与您的 Javascript 代码
  • 用于存储用户输入到 HTML 元素中的所有数据的主干模型
  • 一个后端服务器,可以通过来自 jQuery 的 AJAX 请求处理 RESTful JSON 调用

我认为您唯一缺少的是模型上有一个 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);

这将使您快速开始使用将新模型保存回服务器的表单。

您的服务器需要做几件事:

  • 返回有效的 HTTP 响应代码(200 或表示一切正常的其他响应)
  • 返回发送到服务器的 JSON,包括服务器分配给模型的任何数据,例如 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/

有关javascript - 使我的旧工作流程适应 Backbone的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从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""-

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  4. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在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

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  8. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  9. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用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

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐