Получение одной базовой модели с сервера
Скажем, у меня есть настройка маршрута:
'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)
? Это просто кажется слишком неэффективным, когда я просто хочу загрузить свойства для одной модели.
Ответы
Ответ 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!
Ответ 3
уже есть аналогичный вопрос: "Как получить одну модель в Backbone?"
мой ответ там должен работать для вас (и это в coffeescript)
также не забудьте проверить Документацию по серверной модели Backbone Model #, здесь все объяснено
Ответ 4
Я бы загрузил сборку (путем отображения следующего на страницу) только с одной моделью:
photos = new PhotoCollection();
photos.reset([ @Html.ToJson(Model) ]);
Обратите внимание, что код на стороне сервера, который я использую, это ASP.Net MVC, поэтому используйте что-то конкретное для вашей архитектуры на стороне сервера. Также обратите внимание, что квадратные скобки важны, поскольку они берут вашу сингулярную модель и переносят ее в массив.
Надеюсь, что это поможет.