如何修改Backbone同步期间生成的URL,但仅限于特定请求

时间:2013-02-07 15:56:54

标签: javascript backbone.js

我想更改实体调用destroy时生成的URL。我不想将HTTP DELETE写入/ {Action} / {EntityID},而是发送/ {Action} / {EntityID} / {SecondEntityID}。

item.destroy({
    data: $.param({
        playlistId: playlistId
    }),
    processData: true,
    success: callback,
    error: function (error) {
        console.error(error);
    }
});

我认为像这样的东西可能会起作用,但它似乎没有附加任何其他参数。如果我想扩展只是破坏'URL?

,我是否必须完整地实现我自己的同步方法

1 个答案:

答案 0 :(得分:3)

您可以通过在调用destroy时传入选项中的.url属性来覆盖。由于我假设您希望每次通话都这样做,您可以这样做:

var MyModel = Backbone.Model.extend({
  destroy: function(options) {
    // Override URL
    options || (options = {});
    // You can put whatever you need here,
    options.url = 'http://www.awesome.com/destroy/' + this.get('id') + '/' + this.get('secondaryId');

    // Call Model.destroy().
    // We are reusing the existing functionality from Backbone.Model.destroy().
    Backbone.Model.prototype.destroy.apply(this, arguments); 
  }
});

var m= new MyModel({ id: 123, secondaryId: 456 });

// Note: You need to set 'id' in order for destroy() call to be successful.
m.destroy({
  sucess: function() { console.log('good'); },
  error: function() { console.log('bad'); }
});

如果您打开Firebug或Chrome开发工具,您应该会看到向www.awesome.com发出XHR / AJAX调用。

由于您提到要在所有实体中执行此操作,因此在这种情况下您可以执行的操作是在应用程序中创建BaseModel,并使所有实体从中扩展。

无论如何,希望这有帮助!

JSFiddle:http://jsfiddle.net/EwQaD/