Ошибка соединителя Backbone-couchdb: необходимо указать свойство или функцию URL

Я только начал работать с backbone.js и CouchDB, используя простое «встречное» приложение, чтобы изучить основы. Версию, использующую localstorage, можно найти здесь: демонстрационная скрипта. Это простое приложение, отображающее счетчик, который можно увеличивать и уменьшать. Значение счетчика хранится в базе данных. В версии, на которую ссылаются, я использую localstorage, который работает нормально.

Проблема возникает, когда я преобразовываю свой пример для использования CouchDB. Поэтому я создал диван-приложение и адаптировал код для работы с коннектором backbone-couchdb. Я также включил атрибуты конфигурации БД (как упоминалось здесь ). Соответствующая (адаптированная) часть кода находится ниже (которая сводится к включению атрибута url).

var Counter = Backbone.Model.extend({

  defaults: {
    countervalue: 0
  },

  initialize: function() {
     _.bindAll(this);
  },

  increment: function() {
     this.save({countervalue: this.get('countervalue') + 1});
  },

  decrement: function() {
     this.save({countervalue: this.get('countervalue') - 1});
  }
});

var Counters = Backbone.Collection.extend({

 model: Counter,

 url : "counters",

 initialize: function() {
    this.fetch();
 }
});

Однако всякий раз, когда я увеличиваю или уменьшаю счетчик, возникает следующая ошибка: «Должно быть указано свойство или функция« url »». Из документации я понял, что модель получает свой URL-адрес из коллекции, в которой она содержится. Кажется, это не так? Что я делаю неправильно?

Возможно, еще одна важная часть приложения — это место, где я создаю экземпляр модели счетчика (ее также можно увидеть в демонстрационной скрипте); метод инициализации AppView:

    initialize: function() {
        var currentCounter;
        if (theCounters.size() > 0) currentCounter = theCounters.last();
        else {
            currentCounter = new Counter();
            theCounters.push(currentCounter);
        }
        this.counterview = new CounterView({
            model: currentCounter
        });
    }

person Johan B    schedule 25.12.2012    source источник


Ответы (1)


Я не работал с CouchDB и Backbone.js вместе, но думаю, обходной путь тот же, что и в этом объяснении.

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

Чтобы заставить его работать, вы можете либо указать URL-адрес для модели (помните, что это может быть функция, а не просто строка), либо вы можете использовать атрибут urlRoot, и этот urlRoot — это то, что мы понимаем как «URL-адрес коллекции» (где он добавит свой id). Если urlRoot было /counters, а у вас была модель с id из 1, то конечный URL (он делает это за вас) будет, например, /counters/1.

Изменить:

Вы можете проверить этот вопрос, если вы этого не сделали, даже если он не о CouchDB, но он может пролить свет на проблему: Как получить одну модель в Backbone?

person Meta    schedule 25.12.2012
comment
Спасибо за ваш ответ. Добавление свойства urlRoot исправляет ошибку, но, похоже, поведение не корректно (т. е. я не получаю сохраненную модель при перезапуске приложения, но это может быть связано и с другими причинами). В любом случае, меня очень смущает то, что вы упомянули о свойстве url, поскольку оно, кажется, противоречит документу: documentcloud.github.com/backbone/#Model-url или нет? Спасибо за любые дополнительные разъяснения. - person Johan B; 26.12.2012
comment
Из того, что я вижу после двойной проверки документов, вы были так правы, когда устанавливали атрибут url коллекции и думали, что это все, что вам нужно. Однако, насколько я понимаю и знаю на данный момент, этот атрибут будет работать только при синхронизации всей коллекции (то есть, если у вас есть 3 модели с 1, 2 и 3 как id, коллекция синхронизирует их с root/1 и т. д.). Однако ваш код сохраняет модели по отдельности, поэтому они на самом деле не знают, в какой коллекции они находятся. Вот почему вам нужно указать url или urlRoot в модели. Это более или менее то, что говорит документ ^^ - person Meta; 26.12.2012