【问题标题】:Adapt my old work flow to Backbone使我的旧工作流程适应 Backbone
【发布时间】:2011-12-04 16:27:44
【问题描述】:

我开始构建一个新应用程序,我想使用 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 的正确方法是什么?将删除/更新/创建/等的实际调用放在哪里?

【问题讨论】:

    标签: javascript mvvm backbone.js


    【解决方案1】:

    如果视图的“el”是表单标签,那么你可能会使用内置的事件对象绑定一个函数来提交,但如果视图的根是别的东西,那么你需要在渲染函数中附加点击处理程序。

    【讨论】:

      【解决方案2】:

      您的想法是正确的,Backbone 应该让您使用相同的基本高级工作流程概览轻松完成工作。请注意,您仍将使用 jQuery 来实现此功能 - 您将通过 Backbone 类型的组织方面来实现。

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

      • 用于协调 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

      希望对你有帮助。

      【讨论】:

      • 这很有帮助...谢谢!
      • 方法sync()save()有什么关系还是互斥?
      • 它是相关的,是的。当你调用save 时,它最终会委托给sync 方法。默认是使用Backbone.sync 方法。您可以通过直接在模型定义中提供 sync 方法来覆盖它。
      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多