Подтвердить что ты не робот

Получение одной базовой модели с сервера

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

'photos/:id' : 'showPhoto'

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

Когда их друг нажимает на общую ссылку, showPhoto получает обратный вызов с 12345, прошедшим как идентификатор. Я не могу понять, как получить модель с сервера, потому что даже при установке его свойства id и вызова fetch() основная цепь думает, что модель 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)? Это просто кажется слишком неэффективным, когда я просто хочу загрузить свойства для одной модели.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

model.id = 5; //Don't do this!

Ответ 4

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

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

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

Надеюсь, что это поможет.