У меня есть Clock
модель в Backbone:
var Clock = Backbone.Model.extend({});
Я пытаюсь получить экземпляр, в котором есть последняя информация /clocks/123
. Некоторые вещи, которые я пробовал:
метод уровня "класса"
Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'
создание экземпляра, а затем его вызов fetch
:
c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified
Коллекция
Я попытался создать AllClocks
ресурс коллекции (хотя мне это не нужно на странице):
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/
Как мне получить только одни часы с поддержкой API?
javascript
model-view-controller
rest
backbone.js
Джеймс А. Розен
источник
источник
Ответы:
Ваш второй подход - это подход, который я использовал. Попробуйте добавить в свою модель часов следующее:
url : function() { var base = 'clocks'; if (this.isNew()) return base; return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id; },
Этот подход предполагает, что вы реализовали контроллеры с хэш-бангом в своем URL-адресе, например http://www.mydomain.com/#clocks/123 , но он должен работать, даже если вы еще этого не сделали.
источник
[collection.url]/[id]
.Попробуйте указать urlRoot в модели:
Из документов:
var Book = Backbone.Model.extend({urlRoot : '/books'}); var solaris = new Book({id: "1083-lem-solaris"}); solaris.fetch();
источник
currentBook.set('id', 13423, {silent:true})
. Это тоже работает, но я не уверен, почему:currentBook.id = 13423
model.id
по сути является синонимомmodel.attributes.id
. Если вы звонитеmodel.set('id')
, Backbone устанавливаетmodel.id
все, что вы указали. Иmodel.id
это то, что используется при создании URL-адреса для конкретной модели.Я лично рекомендую, следуя документации метода URL-адреса модели #
model = new Model(id: 1) view = new View(model: model) collection = new Collection([model]) model.fetch()
в вашей коллекции не забудьте добавить URL-адрес коллекции:
url: "/models"
и в вашей функции инициализации View выполните:
this.model.bind("change", this.render)
таким образом магистраль будет выполнять запрос ajax, используя этот URL:
"/models/1"
ваша модель будет обновлена, и представление будет отображаться без изменения Collection # url или Model # urlRoot
примечание: извините, этот пример появился в сценарии кофе, но вы можете легко перевести его на js, добавив операторы var
источник
{}
внутри()
's для переданных объектов и, необязательно,;
в конец строкvar Person = Backbone.Model.extend({urlRoot : '/person/details'}); var myName = new Person({id: "12345"}); myName.fetch();
В результате вы делаете запрос Ajax на
URL http://[domainName]/person/details/id
и вы получили ответ в формате JSON.
Enjoyiiii !!!
источник
... и сделайте это, если вам не нужна завершающая косая черта в urlRoot модели:
url : function() { return this.urlRoot + this.id; },
источник
Вероятно, вам следует обращаться к объекту через коллекцию и постоянно хранить его в коллекции. Вот как это сделать:
var AllClocks = Backbone.Collection.extend({ model: Clock, url: '/clocks/' }); var allClocks = new AllClocks(); my_clock = allClocks.add({id: 123}); my_clock.fetch()
источник
Я хочу использовать URL RESTful, но не могу понять, почему нельзя добавить postId к базовому 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());
Тогда я знаю, что только после того, как я установил idAttribute как postId в модели, смогу ли я получить правильный URL. как это:
var PostModel = Backbone.Model.extend({ idAttribute: 'postId', urlRoot: 'getBlogPost', defaults: { postTitle: "defaultTitle", postTime: "1970-01-01", postContent: "defaultContent", postAuthor: "anonymous" } });
источник