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

Jon*_*lls 3 javascript backbone.js backbone-model

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

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

myservice/deleteUser.aspx?id=1
myService/getUser.aspx?id=1
myService/setUser.aspx? //post model
Run Code Online (Sandbox Code Playgroud)

我不知道它如何与骨干一起使用sync?我想我必须覆盖fetch/ savedestroy

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

nik*_*shr 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();
Run Code Online (Sandbox Code Playgroud)

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

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