Как получить одну модель в Backbone?

У меня есть модель Clock в Backbone:

var Clock = Backbone.Model.extend({});

Я пытаюсь получить экземпляр, содержащий самую последнюю информацию из /clocks/123. Некоторые вещи, которые я пробовал:

метод класса "class"

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 Clock?

Ответ 1

Ваш второй подход - это подход, который я использовал. Попробуйте добавить следующую модель часов:

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, но он должен работать, даже если вы еще нет.

Ответ 2

Попробуйте указать urlRoot в модели:

Из документов:

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();

Ответ 3

Я лично рекомендую, следуя Документация по методу URL-модели Model #

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"

ваша модель будет обновлена ​​и визуализированный вид без изменения URL-адреса коллекции # или модели # urlRoot

Примечание: извините, этот пример вышел в кофе script, но вы можете легко перевести его в js, добавив инструкции var

Ответ 4

var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();

В результате вы делаете запрос Ajax на

URL http://[domainName]/person/details/id 

и у вас ответ JSON.

Enjoiiii!!!

Ответ 5

... и сделайте это, если вы не хотите, чтобы конечная косая черта на модели urlRoot:

    url : function() {                        
        return this.urlRoot + this.id;
    },

Ответ 6

Вероятно, вы должны получить доступ к объекту через коллекцию и постоянно хранить ее в коллекции. Вот как это сделать:

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});

var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()

Ответ 7

Я хочу использовать 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"
    }
});