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


у меня есть 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?

7   92   2011-02-24 00:06:32

7 ответов:

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

url : function() {
  var base = 'clocks';
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},

этот подход предполагает, что вы реализовали контроллеры с hashbang в вашем URL-адресе так,http://www.mydomain.com/#clocks/123, но это должно работать, даже если вы еще не сделали.

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

документы:

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

Я лично рекомендую, после модель#url метод документации

model = new Model(id: 1)
view = new View(model: model) 
collection = new Collection([model])
model.fetch()

в вашей коллекции не забудьте добавить url коллекции:

url: "/models"

и в вашем представлении инициализировать функцию do:

this.model.bind("change", this.render)

таким образом, backbone будет делать запрос ajax, используя этот url:

"/models/1"

ваша модель будет обновлена и вид отображается, без изменения коллекции#url или модели#urlRoot

Примечание.: жаль, что это пример вышел в Coffee script, но вы можете легко перевести его в js, добавив операторы var

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 !!!

...и сделайте это, если вы не хотите, чтобы конечная косая черта на модели 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()

Я хочу использовать RESTful url, но я не мог понять, почему '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"
    }
});