2013-07-04 18 views
9

Z mojego punktu widzenia domyślnym zachowaniem modeli szkieletowych JS jest zwrócenie adresu URL kolekcji, , chyba że model ma określony urlRoot. Nie mogę sprawić, żeby to zachowanie działało.BackboneJS model.url przy użyciu kolekcji collection.url

Z dokumentacji:

model.url (...) Generuje adresy URL w postaci: "[collection.url]/[id]" domyślnie, ale można zastąpić, określając wyraźne urlPobiega, jeśli kolekcja modelu nie powinna być brana pod uwagę.

Oto moja kolekcja, i model odpowiednio:

var MyCollection = Backbone.Collection.extend({ 
    model: Model, 
    initialize: function(options){ 
     this.options = options || {}; 
    }, 
    url: function(){ 
     return "/theurl/" + this.options.param; 
    } 
}); 
return MyCollection; 

...

var MyModel = Backbone.Model.extend({ 
    urlRoot: '/theurl', 
    initialize: function() { 
    } 
}); 
return MyModel; 

Kiedy model jest ładowany bez zbierania, działa świetnie i przedkłada /theurl, ale po załadowaniu do kolekcji wszystkie metody są przesyłane pod numer /theurl/param/.

Jeśli dobrze rozumiem dokumentację, model urlRoot powinien nadpisać to zachowanie; a nawet wtedy URL modelu powinien być /theurl/param/{MODEL-ID}.

Jakieś pomysły na temat tego, czego mi brakuje/nieporozumienia?

...

PS: model: Model z kolekcji doprowadza się poprzez RequireJS

Odpowiedz

9

będzie zawsze używać url kolekcji, nawet jeśli masz urlRoot określony.

Powód urlRoot polega na tym, że można go używać w trybie zastępowania lub jeśli model nie znajduje się w zbiorze (na przykład może zostać usunięty, ale nadal istnieje na kliencie).

Więc jeśli chcesz fetch lub save modelu i zastąpić URL wygenerowany przez zbieranie musisz zdać urlRoot do tych metod wyraźnie jako opcja. Na przykład:

yourModel.save({ url: yourModel.urlRoot }); 

Zgadzam się, że dokumentacja jest myląca i to mnie zaskoczyło ostatnio.

+0

Dzięki za odpowiedź. Dokumentacja wydaje się tam bardzo niejednoznaczna. Wszelkie pomysły na to, dlaczego nie dołączają identyfikatora modelu do końca adresu URL kolekcji? – caleb

+0

Jest kilka rzeczy. Czy właśnie stworzyłeś model na kliencie? Jeśli tak, to nie musi mieć identyfikatora, ponieważ nie został jeszcze zapisany na serwerze. W tym przypadku będzie miał tylko cID. – dcarson

+2

Myślę, że powinno to zamiast tego powiedzieć: 'yourModel.save ({}, {url: yourModel.urlRoot});'. Sposób, w jaki obecnie jest napisany, spowoduje ustawienie właściwości 'url' na obiekcie, ponieważ pierwszym argumentem funkcji' zapisz' jest asocjacja atrybutów. – flyingL123

1

UrlRoot powinien być funkcją i model musi mieć zdefiniowany attributeId. Jeśli zdefiniujesz model w ten sposób, cała operacja będzie działać, jeśli model jest w zbiorze, lub nie.

Kręgosłup dodaje modelId na końcu adresu URL, który jest zwracany przez funkcję urlRoot.

var MyModel = Backbone.Model.extend({ 
    attributeId: 'myModelId' 
    urlRoot: function() { 
     return '/theurl'; 
    }, 
    initialize: function() { 
    } 
    defaults: { 
     myModelId: null 
    } 
}); 
+0

Właśnie to przetestowałem, ustawiając 'urlRoot' jako funkcję zamiast łańcucha i nie użyłem funkcji' urlRoot' modelu, gdy model był w kolekcji i 'save' został wywołany w modelu. – dcarson

+0

jeśli model jest w kolekcji, używany jest adres URL kolekcji. urlRoot jest tylko wtedy, gdy model jest poza zbiorem. – maketest

+0

Dokładnie! Takie zachowanie było tym, o co pytała osoba pytająca, ponieważ było dla niego nieoczekiwane. Dokumentacja jest myląca i sugeruje, że ustawienie 'urlRoot' będzie oznaczało, że model ** always ** używa urlRoot, nawet jeśli jest w kolekcji. Jak już powiedziałem w swojej odpowiedzi, a właśnie powiedziałeś w swoim komentarzu, tak nie jest. – dcarson

0

W modelu, spróbuj:

url: function() { 
    return 'your url goes here'; 
}