Извлечение одной модели Backbone с сервера - PullRequest
17 голосов
/ 12 сентября 2011

Скажем, у меня есть настройка маршрута:

'photos/:id' : 'showPhoto'

, и кто-то делится URL: www.mysite.com/photos/12345 с другом.

Когда их друг нажимает на общую ссылку, showPhotoперезванивается с 12345 переданным в качестве идентификатора.Я не могу понять, как извлечь модель с сервера, потому что даже при установке свойства id и вызове fetch (), Backbone считает, что модель isNew, и поэтому URL-адрес запроса ajax просто /photos вместо /photos/12345:

showPhoto: (id) ->
  photo = new models.Photo _id:id
  photo.fetch #does a GET to /photos, I would have expected it to request /photos/12345
    success: () ->
      render photo view etc...

Photo = Backbone.Model.extend
  idAttribute: '_id'
  urlRoot: '/photos'

Модель Photo обычно является частью коллекции, но в этом случае кто-то посещает сайт напрямую и ожидает увидеть данные только для одной фотографии, поэтому коллекция не создается в этом экземпляре.состояние приложения.

Является ли решение загрузить всю коллекцию фотографий и затем использовать collection.getById(id)?Это просто кажется слишком неэффективным, когда я просто хочу загрузить свойства для одной модели.

Ответы [ 4 ]

25 голосов
/ 12 сентября 2011

если у вас нет модели как части коллекции, вы должны сообщить модели полный URL-адрес вручную. он не будет автоматически добавлять идентификатор к указанному вами urlRoot. Вы можете указать функцию как urlRoot, чтобы сделать это:

Photo = Backbone.Model.extend({
  urlRoot: function(){
    if (this.isNew()){
      return "/photos";
    } else {
      return "/photos/" + this.id;
    }
  }
});

Backbone использует id модели, чтобы определить, является ли она новой или нет, поэтому после ее установки этот код должен работать правильно. если это не так, вы всегда можете проверить идентификатор в операторе if вместо проверки isNew.

3 голосов
/ 25 января 2015

Вам не нужно указывать магистрали, добавлять ли идентификатор в URL.Согласно документации: http://backbonejs.org/#Model-fetch, вы можете просто установить urlRoot равным URL-адресу в коллекции.

Backbone автоматически добавит желаемый идентификатор к URL-адресу, если вы используете один из следующихметоды:

model.set("id", 5); //After initialized
model = new Backbone.Model({id: 5}); //New model

Если вы вручную установите идентификатор в хэше атрибутов или непосредственно в модели, магистраль не будет об этом знать.

model.id = 5; //Don't do this!
2 голосов
/ 17 сентября 2011

уже есть похожий вопрос: " Как мне выбрать одну модель в Backbone? "

мой ответ там должен работать для вас (и это в coffeescript)

также не забудьте проверить Backbone Model # документация по URL , там все объяснено

1 голос
/ 12 сентября 2011

Я бы загрузил коллекцию (с помощью рендеринга следующего на страницу) только с одной моделью в ней, как это:

photos = new PhotoCollection();
photos.reset([ @Html.ToJson(Model) ]);

Обратите внимание, что код на стороне сервера, который я использую, это ASP.Net MVC, поэтомуиспользуйте что-то конкретное для вашей серверной архитектуры.Также обратите внимание, что квадратные скобки важны, поскольку они берут вашу единственную модель и заключают ее в массив.

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...