Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干与Rails中的混搭模型同步_Javascript_Jquery_Backbone.js - Fatal编程技术网

Javascript 主干与Rails中的混搭模型同步

Javascript 主干与Rails中的混搭模型同步,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我有一个rails控制器,它将模型混搭作为全局json对象发送。像这样的 { dogs : { species: {}, ...}, cats : { food: {}, ...}, foxes : { }, ..., ... } 在我的客户端,我将所有这些实体整齐地划分为不同的主干模型和主干集合 $.get("/whatever", function(data){ catCollection.reset(data.cats); dogCollection.rese

我有一个rails控制器,它将模型混搭作为全局json对象发送。像这样的

{
  dogs : { species: {}, ...},
  cats : { food: {}, ...},
  foxes : { },
  ...,
  ...
}
在我的客户端,我将所有这些实体整齐地划分为不同的主干模型和主干集合

$.get("/whatever", function(data){
  catCollection.reset(data.cats);
  dogCollection.reset(data.dogs);
  // etc
});


data = {};
data.cats = catCollection.toJSON();
data.dogs = dogCollection.toJSON();
// etc
$.post("/whatever", data);

在一些onchange事件中,我需要将一些模型属性的mashup作为httppost请求发送回服务器,服务器发送一个响应,该响应再次跨越几个模型的值


如何设置Backbone.sync来处理这种ajax场景?我不想更改rails后端,因为它是一个相当稳定的实现。或者我是否在一个主干视图中通过jQuery发出香草$.ajax请求,并在ajax成功/失败时在回调中处理它?

这是可能的,但可能很难修改backbone.sync以使用此结构。我建议使用普通的jquery$.ajax请求。成功后,将信息分离并填充您的收藏

$.get("/whatever", function(data){
  catCollection.reset(data.cats);
  dogCollection.reset(data.dogs);
  // etc
});


data = {};
data.cats = catCollection.toJSON();
data.dogs = dogCollection.toJSON();
// etc
$.post("/whatever", data);


我认为有两种方法可以通过主干实现这一点。我想我应该从一个模型开始来表示mashup:

var MashupModel = Backbone.Model.extend({
});
然后,您可以像平常一样传入任何模型(或为此而传入一个集合):

然后,当响应恢复正常时,执行您想要的操作:

my_mash.save({}, {
  success: function(model, response) {
    // do stuff here to put new data into the proper models / collections
  },
  error: function() { alert("I FAIL!"); }
});
这一切都很好。。。但是,我认为最好将上述内容下推到MashupModel对象中,而不是在请求级别。同样,有几种方法:

var MashupModel = Backbone.Model.extend({
  initialize: function(attrs) {
    // can't remember the actual code, but something along the lines of:
    _.each( attrs.keys, function(key) {
      this.set(key, attrs.key.toJSON();
    });
  },

  save: function(attrs, opts) {
    var callback = opts.success;
    opts.success = function(model, response) {
      // do your conversion from json data to models / collections
      callback(model, response);
    };
    // now call 'super'
    // (ala: http://documentcloud.github.com/backbone/#Model-extend)
    Backbone.Model.prototype.set.call(this, attrs, opts);
  }
});
或者您可以重写toJSON(因为主干调用它来为ajax准备属性):

现在,您只需执行以下操作:

var my_mash = new MashupModel({
  dog:    dogModel,
  cat:    catModel,
  foxes:  foxCollection
});
// do some stuff...

my_mash.save({}, {
  success: function(model, response) {
    // now only do stuff specific to this save action, like update some views...
  },
  error: function() { alert("I FAIL!"); }

非常有趣。我很想创建一个抽象的主干模型,就像你的MashupModel一样,但在那之前我对社区进行了民意调查。我想我会尝试一下,然后报告实验的进展情况,然后可能会接受你的答案。再次感谢!
var my_mash = new MashupModel({
  dog:    dogModel,
  cat:    catModel,
  foxes:  foxCollection
});
// do some stuff...

my_mash.save({}, {
  success: function(model, response) {
    // now only do stuff specific to this save action, like update some views...
  },
  error: function() { alert("I FAIL!"); }