覆盖Backbone Sync以使用不同的调用来获取/保存/销毁

时间:2012-11-06 16:00:30

标签: javascript backbone.js backbone-model

我迟到骨干派对的原因是因为我担心它不会很好地与我现有的网络服务很好地配合。我甚至已经到了使用我自己版本的骨干控制器和模型的地步,但是它只能编写我自己的(当然)更糟糕的实现方式。

我正在使用Asp.net网络服务,因此,假设我们正在更新用户模型,我使用以下三个调用:

myservice/deleteUser.aspx?id=1
myService/getUser.aspx?id=1
myService/setUser.aspx? //post model

我看不出它如何与主干sync一起使用?我假设我必须覆盖fetch / savedestroy

我会非常感谢一些好的例子。我已经阅读了这个主题,包括注释来源,但我正在为“啊哈”时刻而苦苦挣扎。

1 个答案:

答案 0 :(得分:13)

您可以为您的集合或模型提供自定义sync函数,当您获取/更新/销毁元素时,该函数将被调用而不是Backbone.sync。然后,您可以定制选项以发出与您的服务器设置匹配的请求。例如,

var M = Backbone.Model.extend({

    sync: function(method, model, options) {
        options || (options = {});

       // passing options.url will override 
       // the default construction of the url in Backbone.sync

        switch (method) {
            case "read":
                options.url = "/myservice/getUser.aspx?id="+model.get("id");
                break;
            case "delete":
                options.url = "/myservice/deleteUser.aspx?id="+model.get("id");
                break;
            case "update":
                options.url = "/myService/setUser.aspx";
                break;
        }

        if (options.url)
            return Backbone.sync(method, model, options);
    }

});

var c = new M({id: 1});
c.fetch();
c.save();
c.destroy();

还有一个模拟这些调用的小提琴http://jsfiddle.net/nikoshr/4ArmM/

如果使用PUT和DELETE作为HTTP动词困扰您,您可以通过添加Backbone.emulateHTTP = true;强制POST 有关修订版,请参阅http://jsfiddle.net/nikoshr/4ArmM/1/