2011-10-13 40 views
8

你如何取代Backbone.sync而不做任何事情?我的应用程序有一个“提交”按钮,它将为我执行AJAX POST,所以我不想使用Backbone.sync提供的auto-magic默认行为。如何取代Backbone.sync,甚至没有localStorage?

我也不想用,因为我努力使本站兼容IE6和7

话虽这么说,我几乎只想骨干什么都不做,除了保留记录骨干localStorage的适配器在JS内存中(类似于Spine.js)。这甚至有可能吗?

+0

简单,不要用骨干,并切换到一个简单的跨浏览器的Ajax处理程序。 – 2011-10-13 04:29:05

回答

19

最简单也是最好的方法是取代Backbone.Sync,而不是简单地忽略它。这里有你不想调用的方法:

类别:

  • 创建

型号:

  • 保存
  • destroy

如果您避免调用这些方法中的任何一种,您将有效地忽略Backbone.Sync并能够编写自己的代码来执行AJAX调用。

当我开始时,我写了很多Backbone代码,没有涉及服务器调用。没有规则说你必须使用Backbone的所有功能。事实上,我会说相反的事实。骨干网以这种模块化的方式编写,每个功能和专业领域都非常好,所以你应该只使用你实际需要的东西。

在内存中创建您的模型,请拨打setget来存储数据。根据需要将它们填入addremove。将模型和集合传递给您的视图并将其呈现给HTML DOM。只要避免调用上面列出的方法,您就不必担心Backbone.Sync。

+0

谢谢。这非常有意义。在旁注中,如果你不使用Model.destroy(),你如何正确“销毁”某些东西?使用collection.remove并绑定到remove事件? – kidcapital

+0

是的,那样做。在任何有参考的地方去除引用模型,它将被垃圾收集。 –

1

我曾将this gist作为Backbone.js教程的一部分。它伪造Backbone.sync只写日志,但为了赋予其真实感,它还将模型的.cid属性复制到它的.id属性中,以使模型显示为同步。谨防在生产中使用该技术的各种不必要的后果!但我们都在这里同意大人,对吧?

这里没有记录了同样的想法:

Backbone.sync = function(method, model, succeeded) { 
    if(typeof model.cid != 'undefined') { 
     // It's a freshly made model 
     var cid = model.cid; 
     // ..fake that it's .cid turns into a "real" .id: 
     model.unset('cid').set({id:cid}, {silent:true}); 
    } 
    // Oh yes, it all went sooo well ;-) 
    succeeded(model); 
}; 
+2

我认为自你写这个以来API已经发生了变化,因为第三个参数不是回调函数。我只是'返回false',它似乎工作正常。但是你提到了“各种不需要的后果” - 如果我的所有数据都是客户端的,不需要持久性,那会是什么? –