Подтвердить что ты не робот

Лучший способ сделать одну модель "выбраной" в коллекции Backbone.js?

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

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

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

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

selected: false

Когда он зависает или выбирается клавишей, это будет

selected: true

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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()
   }
});

Ответ 4

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

Ответ 5

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

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

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