Backbone: как обновить свойство всех моделей с помощью одной команды

#javascript #backbone.js

#javascript #backbone.js

Вопрос:

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

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

Ответ №1:

В проекте, над которым я работаю, мы сохраняем «выбранный» элемент на уровне коллекции. Мы добавили getCurrent() setCurrent(model) методы and, и коллекция вызовет change:selection событие. Для нас это сработало очень хорошо.

—РЕДАКТИРОВАТЬ: пример кода для каждого запроса.—

Следующее является частью нашего base.collection.js который мы распространяем на все наши коллекции. Вы заметите, что мы можем установить current на основе id или фактической модели, чтобы col.setCurrent(123) col.setCurrent(anInstanceOfAModel) оба работали. Также вызов setCurrent модели, которая уже является текущей, не вызывает событие изменения

     setCurrent: function (id)
    {
        var isModel = !(_.isString(id) || _.isNumber(id));

        var triggerChange = this._setupCurrent(isModel
                                ? id
                                : this.get(id));

        if (triggerChange)
            this.trigger("change:current", this._current);

        return this.getCurrent();
    },

    getCurrent: function ()
    {
        return this._current;
    },

    _setupCurrent: function (current)
    {
        var old = this._current;
        this._current = current;

        if (current amp;amp; old amp;amp; old.id == current.id)
            return false;

        return true;
    },
  

Комментарии:

1. У вашей модели также есть selected свойство? OP, похоже, интересуется этим.

2. Нет — в основном потому, что я нахожу неудобным (как кажется, делает OP) перебирать каждый элемент, чтобы их отменить.

3. @timDunham в любом случае, вы могли бы опубликовать пример кода? Я пытаюсь сделать что-то очень похожее на то, что вы достигли. Заранее спасибо! 😉

Ответ №2:

У вас также может быть объект «состояние», в котором вы храните последнюю выбранную папку.

Затем вы меняете это обратно на не выбрано, без необходимости перебирать всю коллекцию.