【问题标题】:Post data to RESTful by backbone通过主干将数据发布到 RESTful
【发布时间】:2014-06-21 10:12:42
【问题描述】:

第一次尝试使用主干模型集合将数据从主干发布到 REST。

define(["underscore" , "backbone"],function(_ , Backbone){
  var CustomerModel = Backbone.Model.extend({
    urlRoot: 'http://myresturl/api/CusWeb',
    initialize: function(){

    },
    defaults : {
        UID: "00000000-0000-0000-0000-000000000000",
        Sex: 0,
        Name: "",
        Company: "",
        Address: "",
        Email: ""
    }
  });
  return CustomerModel;
});

define(["underscore","backbone","models/CustomerModel"] , function(_ ,Backbone,CustomerModel){
  var CustomerCollection = Backbone.Collection.extend({
    url: 'http://myresturl/api/CusWeb',
    model:CustomerModel
  });
  return CustomerCollection;
});

我正在尝试通过单击主干视图中的按钮将数据从主干发布到 REST URL。

define(["jquery" ,
  "underscore" ,
  "backbone" ,
  "text!templates/Customer/registerCustomerTemplate.html",
  "models/CustomerModel",
  "user",
],function($ , _ , Backbone, RegisterDescriptionTem, CustomerModel, Customer){
   var userObj = new Customer();

   var ContainerRegisterView = Backbone.View.extend({
    el : $("#webbodycontainer"),
    initialize : function(){

    },
    events : {
        'click #register' : 'registerUser'
    },
    registerUser : function(){
        this.model.set({
            UID: "00000000-0000-0000-0000-000000000000",
            Sex: 1,
            Name: "",
            Company: "",
            Address: "",
            Email: ""
        });
        this.model.save();
        console.log(this.model.get('Sex'));
    },
    render : function(){
        var _registerDes = _.template(RegisterDescriptionTem);
        this.model = new CustomerModel();
        this.$el.append(_registerDes((this.model.toJSON())));
    }
  });
  return ContainerRegisterView;
});

console.log(this.model.get('Sex')); 显示在浏览器的控制台 (1) 中,但数据未保存到数据库。

这是路由器:

 define([
    .....
      'views/Customer/ContainerRegister',
 ], function(ContainerRegister){
  var AppRouter = Backbone.Router.extend({
       routes: {
      ......

       }

   var app_router = new AppRouter;
   app_router.on('route:registerAction', function(register){
       if(window.currentSection){
          window.currentSection.remove();
       }
       window.currentSection = new ContainerRegister({});
       $('#webbodycontainer').html(window.currentSection.$el);
       window.currentSection.render(register);
     });
 });

感谢您提供的任何其他信息。谢谢。

【问题讨论】:

  • 保存模型时,是否在网络的开发者工具页面看到对服务器的请求?
  • @Sergey:不,我没有。
  • 好吧,如果您没有对 REST 的请求,那么您在 Backbone 应用程序中有错误。尝试在this.model.save();之前设置debugger;并调试
  • @Sergey : 我必须设置backbone debugger 扩展来调试还是主干有自己的调试器?我没有通过谷歌搜索找到它。
  • 不确定这是否与问题有关,但render() 需要在您的视图中返回this

标签: javascript rest backbone.js


【解决方案1】:

首先,您需要像@SteamDev 所说的那样在模型上设置idAttribute。

var CustomerModel = Backbone.Model.extend({
    urlRoot: 'http://myresturl/api/CusWeb',
    initialize: function(){

    },
    defaults : {
        //UID: "00000000-0000-0000-0000-000000000000",
        Sex: 0,
        Name: "",
        Company: "",
        Address: "",
        Email: ""
    },
    idAttribute: "UID" // set "UID" as the alias for "id"
  });

其次,您不需要设置 UID 值(无论是在模型的默认值上,还是在模型实例上)。

【讨论】:

  • 修改后仍然没有任何变化。
  • 你能告诉我你是怎么把模型传给ContainerRegisterView的,当你做new ContainerRegisterView()的时候?
  • 我在我的视图中添加了路由器的块new,并将模型传递给视图,我在我的视图中使用render() 方法。
【解决方案2】:

我认为您的问题可能是缺少模型id。对于主干服务器交互,您可能会发现id 属性是必需的。尝试如下修改您的代码:

define(["underscore" , "backbone"],function(_ , Backbone){
  var CustomerModel = Backbone.Model.extend({
    urlRoot: 'http://myresturl/api/CusWeb',
    initialize: function(){

    },
    defaults : {
        UID: "00000000-0000-0000-0000-000000000000",
        Sex: 0,
        Name: "",
        Company: "",
        Address: "",
        Email: ""
    },
    idAttribute: "UID" // set "UID" as the alias for "id"
  });
  return CustomerModel;
});

这是一篇关于类似问题的博客文章,其中包含更多细节http://blog.markstarkman.com/blog/2012/02/13/getting-backbone-dot-js-to-sync-with-rails-and-mongoid/

【讨论】:

  • 输入idAttribute 时没有出现任何变化。还有一件事我很好奇,this.model.save 似乎不起作用,successerror 函数没有显示任何消息。
【解决方案3】:

检查初始化模型。并且在保存时尝试将第一个参数设为 null。

define(["jquery" ,
    "underscore" ,
    "backbone" ,
    "text!templates/Customer/registerCustomerTemplate.html",
    "models/CustomerModel",
    "user",
  ],function($ , _ , Backbone, RegisterDescriptionTem, CustomerModel, Customer){

     var ContainerRegisterView = Backbone.View.extend({
      el : $("#webbodycontainer"),
      //check initializing your model here.
      initialize : function(){
          _.bindAll(this);
          this.model = new Customer();
      },
      events : {
          'click #register' : 'registerUser'
      },
      registerUser : function(){
          this.model.set({
              UID: "00000000-0000-0000-0000-000000000000",
              Sex: 1,
              Name: "",
              Company: "",
              Address: "",
              Email: ""
          });
          this.model.save(null,{
            success:function(){
                //code after success
            },error:function(){
                //code after error
            },
          });
          console.log(this.model.get('Sex'));
      },
      render : function(){
          var _registerDes = _.template(RegisterDescriptionTem);
          this.model = new CustomerModel();
          this.$el.append(_registerDes((this.model.toJSON())));
      }
    });
    return ContainerRegisterView;
  });

【讨论】:

  • 嘿 Nakul91,我收到了这个错误Uncaught Error: bindAll must be passed function names
  • 删除该行并检查一次。
  • 删除了该行,没有任何变化(this.model.save() 不起作用)。
  • 您是否在浏览器控制台中遇到任何错误?
猜你喜欢
  • 2012-02-21
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多