Как получить одну модель в Backbone? - PullRequest
93 голосов
/ 24 февраля 2011

У меня есть модель 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 ]

137 голосов
/ 06 февраля 2012

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

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

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
26 голосов
/ 17 сентября 2011

Я лично рекомендую, следуя документации Model # 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

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

26 голосов
/ 24 февраля 2011

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

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

12 голосов
/ 26 сентября 2012
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 !!!

0 голосов
/ 24 сентября 2015

Я хочу использовать RESTful url, но не могу понять, почему «postId» не может быть добавлен к базовому URL.postId 'в модели, я могу получить правильный URL.как это:

var PostModel = Backbone.Model.extend({
    idAttribute: 'postId',
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});
0 голосов
/ 02 июля 2014

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

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

var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()
0 голосов
/ 31 августа 2013

... и сделайте это, если вы не хотите использовать косую черту в модели urlRoot:

    url : function() {                        
        return this.urlRoot + this.id;
    },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...