2011-08-08 9 views
26

Potrzebuję jednego z moich modeli szkieletowych, aby trafić w różne adresy URL w zależności od rodzaju wykonywanej akcji. Jak określić działanie w ramach funkcji URL, aby móc określić odpowiedni adres URL? Na przykład:Jak określić różne adresy URL w aplikacji szkieletowej?

Usuń:/myapipath/itemtype/id/
POST:/myapipath/specjalnej ścieżki/
GET: /? Myapipath/specjalnego ścieżka/code = ABC

Umiem powiedzieć różnicę między POST i wszystko inne: this.isNew()

Ale jak odróżnić DELETE i GET w niestandardowej funkcji model.url?

Nie sugeruj, żebym zmienił interfejs API po stronie serwera. To nie zależy ode mnie.

Dzięki!

Odpowiedz

55

Pod względem koncepcyjnym adres URL modelu szkieletowego jest głównym adresem URL GET zasobu. Aby użyć innego adresu URL do niektórych czynności, zastąp funkcję synchronizacji modelu. Na szczęście 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); 
    } 
} 

Edit: Wziąłem kolejny spojrzeć na źródła Backbone i zauważył, że scala cały options argument zbudować params, nie options.params, i aktualizowane moim przykładem odpowiednio.

+0

Dobra odpowiedź! Nie sądzę, aby options.params miał rację, ponieważ Backbone.sync po prostu rozszerza przekazany w 'options', więc gdy szuka params.url, to tak naprawdę to options.url – satchmorun

+0

Dzięki! Poprawiłem odpowiedź, gdy opublikowałeś swój komentarz. :) –

+0

Dzięki - to wydaje się działać do tej pory z niewielkimi modyfikacjami, w szczególności metodaUrl powinna mieć "create" zamiast "post". Wprowadziłem kilka innych zmian do moich celów, ale nic więcej naprawdę nie jest warte uwagi. Dobra odpowiedź. – gcdev