Путаница с моделями в приложении Backbone + React

Вот пример, который использует Backbone с React.

Он определяет Model: var _todos = new Backbone.Model();

И затем добавляет две функции к нему:

var TodoStore = _.extend(_todos, {
  areAllComplete: function() {
    return _.every(_todos.keys(), function(id){
      return _todos.get(id).complete;
    });
  },
  getAll: function() {
    return _todos.toJSON();
  }
});

Что я не понимаю, почему areAllComplete применяется к Model вместо того, чтобы Collection,

Разве это не должно быть функцией в Collection который получит все свои модели и проверит complete приписывать.

Точно так же я ожидаю getAll принадлежать к Collection - получить все свои модели.

Этот пример, кажется, заменяет Collection с Model,

Может быть, я не совсем понимаю, как используются модели.

1 ответ

Решение

Этот пример использует Backbone.Model довольно странным образом, на мой взгляд.

Вот где он добавляет новые todos в магазин:

var id = Date.now();
  _todos.set(id, {
    id: id,
    complete: false,
    text: text
  });
}

То, что он в основном делает, это устанавливает каждый элемент todo как атрибут Model, используя идентификатор в качестве имени атрибута. Это заканчивается _todos.attributes выглядит примерно так

{
  "1436600629317": {
    "id": 1436600629317,
    "complete": false,
    "text": "foo"
  },
  "1436600629706": {
    "id": 1436600629706,
    "complete": false,
    "text": "bar"
  }
}

Это тот же результат, который вы получаете от _todos.toJSON(), Я понятия не имею, почему они решили реализовать его таким образом, если бы они попытались использовать Backbone.Sync, они бы получили серверный API, который не совсем RESTful. Кажется странным использовать Backbone без использования каких-либо возможностей, предоставляемых Backbone. Там есть ссылка на change событие здесь, но я не вижу его где-либо использовать. Вы можете легко переопределить это хранилище, используя любой обычный объект JS.

Единственное, что пример, похоже, на самом деле использует из Backbone, это Backbone.Events в диспетчере. Вы абсолютно правы в том, что использование Collection стало бы более целесообразным, потому что тогда вы могли бы заставить его взаимодействовать с серверным API на основе REST. Этот пример, кажется, использует Backbone только для использования Backbone.

Другие вопросы по тегам