Mam Clock
model w Backbone:
var Clock = Backbone.Model.extend({});
Próbuję uzyskać przykład tego, który zawiera najnowsze informacje /clocks/123
. Kilka rzeczy, których próbowałem:
metoda na poziomie „klasy”
Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'
tworzenie instancji, a następnie wywoływanie fetch
jej:
c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified
kolekcja
Próbowałem utworzyć AllClocks
zasób kolekcji (mimo że nie mam pożytku z czegoś takiego na stronie):
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/
Jak uzyskać jeden zegar wspierany przez API?
javascript
model-view-controller
rest
backbone.js
James A. Rosen
źródło
źródło
Odpowiedzi:
Twoje drugie podejście to podejście, którego użyłem. Spróbuj dodać następujące elementy do swojego modelu Zegara:
url : function() { var base = 'clocks'; if (this.isNew()) return base; return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id; },
To podejście zakłada, że zaimplementowałeś kontrolery z hashbangiem w swoim adresie URL, jak na przykład http://www.mydomain.com/#clocks/123 , ale powinno działać nawet jeśli jeszcze tego nie zrobiłeś.
źródło
[collection.url]/[id]
.Spróbuj określić urlRoot w modelu:
Z dokumentów:
var Book = Backbone.Model.extend({urlRoot : '/books'}); var solaris = new Book({id: "1083-lem-solaris"}); solaris.fetch();
źródło
currentBook.set('id', 13423, {silent:true})
. To też działa, ale nie jestem pewien, dlaczego:currentBook.id = 13423
model.id
jest zasadniczo synonimemmodel.attributes.id
. Jeśli zadzwoniszmodel.set('id')
, Backbone ustawia sięmodel.id
na wszystko, co podałeś. Imodel.id
to jest używane podczas tworzenia adresu URL specyficznego dla modelu.Osobiście polecam, postępując zgodnie z dokumentacją metody Model # url
model = new Model(id: 1) view = new View(model: model) collection = new Collection([model]) model.fetch()
w swojej kolekcji pamiętaj o dodaniu adresu URL kolekcji:
url: "/models"
i w funkcji inicjalizacji swojego View wykonaj:
this.model.bind("change", this.render)
w ten sposób szkielet wykona żądanie AJAX przy użyciu tego adresu URL:
"/models/1"
Twój model zostanie zaktualizowany, a widok wyrenderowany, bez modyfikowania Collection # url lub Model # urlRoot
uwaga: przepraszam, że ten przykład pojawił się w skrypcie kawy, ale można go łatwo przetłumaczyć na js dodając instrukcje var
źródło
{}
wewnątrz()
dla przekazanych obiektów i opcjonalnie;
ad na końcu liniivar Person = Backbone.Model.extend({urlRoot : '/person/details'}); var myName = new Person({id: "12345"}); myName.fetch();
W rezultacie wysyłasz żądanie Ajax na
URL http://[domainName]/person/details/id
i masz z powrotem odpowiedź JSON.
Enjoiiii !!!
źródło
... i zrób to, jeśli nie chcesz, aby końcowy ukośnik w modelu urlRoot:
url : function() { return this.urlRoot + this.id; },
źródło
Prawdopodobnie powinieneś uzyskiwać dostęp do obiektu przez kolekcję i przechowywać go w kolekcji przez cały czas. Oto jak to zrobić:
var AllClocks = Backbone.Collection.extend({ model: Clock, url: '/clocks/' }); var allClocks = new AllClocks(); my_clock = allClocks.add({id: 123}); my_clock.fetch()
źródło
Chcę użyć RESTful url, ale nie mogłem zrozumieć, dlaczego „postId” nie może zostać dodane do podstawowego adresu URL.
var PostModel = Backbone.Model.extend({ urlRoot: 'getBlogPost', defaults: { postTitle: "defaultTitle", postTime: "1970-01-01", postContent: "defaultContent", postAuthor: "anonymous" } }); var post = new PostModel({ postId: 1 }); alert(post.url());
Wtedy wiem, że dopiero po ustawieniu „idAttribute” jako „postId” w modelu mogę uzyskać właściwy adres URL. lubię to:
var PostModel = Backbone.Model.extend({ idAttribute: 'postId', urlRoot: 'getBlogPost', defaults: { postTitle: "defaultTitle", postTime: "1970-01-01", postContent: "defaultContent", postAuthor: "anonymous" } });
źródło