2011-08-08 26 views
26

我需要根据正在执行的操作的类型,选择我的一个主干模型来打击各种URL。如何确定URL功能中的操作,以便我可以指定适当的URL?例如:如何在骨干应用程序中指定各种URL?

DELETE:/ myapipath /项目类型/ ID/
POST:/ myapipath /特殊路径/
GET:/ myapipath /特殊路径/代码= ABC

我知道如何告诉POST和其他东西之间的区别:this.isNew()

但是,我如何区分DELETE和GET之间的自定义model.url函数?

请不要建议我更改服务器端API。这不取决于我。

谢谢!

回答

55

从概念上讲,Backbone模型的url是资源的主要GET url。要对某些操作使用不同的网址,请覆盖该模型的同步功能。幸运的是,Backbone makes it easy to override

window.MyModel = Backbone.Model.extend({ 
    // ... other stuff ... 

    url: '/myapipath/special-path/?code=ABC', 

    methodUrl: { 
    'create': '/myapipath/special-path/', 
    'delete': '/myapipath/itemtype/id/' 
    }, 

    sync: function(method, model, options) { 
    if (model.methodUrl && model.methodUrl[method.toLowerCase()]) { 
     options = options || {}; 
     options.url = model.methodUrl[method.toLowerCase()]; 
    } 
    Backbone.sync(method, model, options); 
    } 
} 

编辑:我又看看骨干源,并注意到它融合了全options参数来构建参数,可以不options.params,并相应地更新我的例子。

+0

好的答案!不过,我不认为options.params是正确的,因为Backbone.sync只是扩展了'选项',所以当它寻找params.url时,它实际上只是options.url – satchmorun

+0

谢谢!当您发布您的评论时,我正在修复我的答案。 :) –

+0

感谢 - 这似乎工作到目前为止只有一些小的修改,最值得注意的是,methodUrl应该有'创建'而不是'后'。我为了自己的目的做了一些其他的改变,但是这里没有其他值得注意的地方。好答案。 – gcdev