Лучший способ сделать одну модель «выбранной» в коллекции Backbone.js? - PullRequest
28 голосов
/ 29 июня 2011

У меня есть коллекция моделей в моем приложении Backbone.js.

Это список элементов, которые вы можете перемещать с помощью мыши или перемещаться с помощью клавиатуры.

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

Так что в моей модели у меня есть атрибут, который называется

selected: false

Когда он находится над или выбран с помощью клавиатуры, тогда это будет

selected: true

Но каков наилучший способ убедиться, что, если эта модель верна,остальные все ложные?

В настоящее время я делаю основную вещь - циклически перебираю каждую модель в коллекции, а затем устанавливаю для выбранной модели значение true.Но мне интересно, есть ли лучший, более эффективный способ сделать это?

Ответы [ 5 ]

32 голосов
/ 29 июня 2011

Быть выбранным, кажется, выходит за рамки модели.Понятие «отобранный» подразумевает, что существуют другие, но модель может беспокоиться только о себе.Поэтому я хотел бы перенести эту ответственность в другое место, где представление о многих моделях и выборе одной из них кажется более естественным и ожидаемым.

Поэтому рассмотрите возможность возложить эту ответственность либо на коллекцию как ассоциацию.Таким образом, this.selected будет указывать на выбранную модель.И затем вы можете добавить метод для возврата выбранной модели в коллекцию.

В качестве альтернативы вы можете передать эту ответственность представлению.Вы можете сделать это, если выбранность модели является проблемой только на уровне представления.

Побочным продуктом снятия ответственности с модели является устранение необходимости циклически проходить всю коллекцию, когдановая модель становится выбранной.

15 голосов
/ 24 февраля 2012

Я так и делаю.Коллекция хранит ссылку на выбранную модель, но состояние сохраняется в модели.Затем его можно адаптировать для более сложного алгоритма выбора моделей.

JobSummary = Backbone.Model.extend({

  setSelected:function() {
    this.collection.setSelected(this);
  }

});

JobSummaryList = Backbone.Collection.extend({
   model: JobSummary,

   initialize: function() {
     this.selected = null;
   },

   setSelected: function(jobSummary) {
     if (this.selected) {
       this.selected.set({selected:false});
     }
     jobSummary.set({selected:true});
     this.selected = jobSummary;
   }
};
3 голосов
/ 22 августа 2011

Я сделал что-то, как предложил мистер Эйзенгауэр.Я хотел концепцию постраничных данных.На самом деле не хотелось смешивать выбранный номер страницы и т. Д. С самой коллекцией, поэтому я создал «модель» для данных таблицы и назвал ее «Снимок».Как то так:

JobSummary = Backbone.Model.extend({});

JobSummaryList = Backbone.Collection.extend({
   model: JobSummary
};

JobSummarySnapshot = Backbone.Model.Extend({
   defaults: {
     pageNumber: 1,
     totalPages: 1,
     itemsPerPage: 20,
     selectedItems: new JobSummaryList(), // for multiple selections
     jobSummaryList: new JobSummaryList()
   }
});
1 голос
/ 04 марта 2015

Возможно, вы захотите взглянуть на два моих компонента:

Backbone.Select имеет минимальную площадь поверхности.К вашим объектам добавляется как можно меньше методов.Идея состоит в том, что вы должны иметь возможность использовать миксины Backbone.Select практически везде, с почти нулевым риском конфликтов.

Backbone.Cycle построен поверх Backbone.Select.Это добавляет методы навигации и еще несколько наворотов.Вероятно, это лучший выбор для нового проекта.

1 голос
/ 10 января 2014

Check Backbone.CollectionView , который включает поддержку выбора моделей, когда они щелкаются из коробки.Случай наведения мыши можно реализовать с помощью метода setSelectedModel.

...