Проблемы с созданием опорных моделей и коллекций - PullRequest
0 голосов
/ 01 июня 2011

Я действительно, действительно пытаюсь выучить Backbone, и мне достаточно много, чтобы обернуть голову (исходя из Rails). Поэтому я пытаюсь написать простое приложение, которое просто выбирает коллекцию из бэкэнда Синатры. Прямо сейчас маршрут /schools возвращает объект JSON, который выглядит как ["One School", "Two School"]. Довольно просто К сожалению, для меня всегда возвращается ReferenceError:

Модель школы

(function() {
   window.school = Backbone.Model.extend({});
}).call(this);

Школьная коллекция

(function() {
  window.schools = Backbone.Collection.extend({
    url: '/schools',
    model: window.school
  });
}).call(this);

Консоль

var f = new window.school({name: "temp"});

1024 * неопределенный *

f.id();

ReferenceErrror

Такие простые взаимодействия, как это, не сработают. Кроме того, вызов window.schools.fetch() приводит к ошибке UndefinedObject. Не знаю, где именно я ошибся, но, похоже, ничего не работает. Любая помощь будет потрясающей!

Редактировать: Коллекция и модель написаны в закрытии, потому что она скомпилирована из Coffeescript.

Ответы [ 3 ]

4 голосов
/ 01 июня 2011

Существует два способа получения идентификатора модели: model.id и model.get('id'). model.id() не определено, поэтому выдает ошибку. Смотри http://documentcloud.github.com/backbone/#Model-id.

1 голос
/ 21 июня 2011

Я никогда не использовал Coffeescript, однако, я поправляюсь в позвоночнике ... поэтому я попробую. Есть несколько вещей, которые могут происходить здесь. backbone.js зависит от jquery или zepto и underscore.js, которые используют $ и _ в качестве специальных переменных. Это может вызывать проблемы с coffeescript.

Возможно, вы захотите запустить пример базового приложения вместо того, чтобы попробовать его с помощью coffeescript.

Что касается кода выше, я думаю, что я заметил несколько вещей:

При создании экземпляра модели с данными у нее не будет идентификатора (поскольку она не синхронизирована с сервером в соответствии с документацией, упомянутой выше). Если данные IS с сервера, то включите id: id в хеш инициализации, и model.id вернет id. Если вам нужен уникальный идентификатор для модели, которая НЕ была синхронизирована, вы можете использовать атрибут 'cid' (который является локальным уникальным идентификатором).

Помните, что когда вы «расширяете», вы на самом деле создаете класс, поэтому, если вы не создали экземпляр экземпляра коллекции, «выборка» не будет работать. Вам нужно будет сделать:

var collection = new Collection();
collection.fetch();

Причина, по которой функция save () не работает, заключается в том, что вы не определили URL для единственной модели. Вы определили его в коллекции, но не в модели, поэтому, если вы попытаетесь создать экземпляр модели, не связанной с коллекцией, у нее не будет ссылки на службу restful.

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

0 голосов
/ 14 июля 2011

f не имеет идентификатора, поскольку он не был сохранен на сервере.У Backbone есть два уникальных идентификатора для каждой модели: один - это клиент, который создается в тот момент, когда модель находится на стороне клиента.Это не отправляется на сервер.Когда модель сохраняется на сервере, Backbone ожидает, что она вернет сохраненную модель в кодировке JSON, которая, конечно, имеет атрибут id (который она получает после сохранения в базе данных) и обновляет локальную модель, чтобы соответствовать отправленным данным моделисервером, тем самым создавая атрибут id в экземпляре модели клиента.Если ваша модель на стороне сервера не совсем соответствует модели на стороне клиента, вы можете переопределить функции Backbone.sync и Backbone.Model.parse, чтобы удовлетворить ваши требования.

window.schools.fetch () завершается ошибкой, поскольку window.schools является классом Collection, а не экземпляром.Создайте экземпляр коллекции так же, как вы создали экземпляр модели, прежде чем извлекать, и убедитесь, что школы ресурсов рельсов правильно настроены для отправки закодированного в json списка экземпляров моделей школ.Также, если вы собираетесь использовать готовую реализацию Backbone.sync, вам нужно будет установить: ActiveRecord :: Base.include_root_in_json = false

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