События коллекции backbone.js - программирование

События коллекции backbone.js

Я разрабатываю веб-приложение jquery и backbone.js.
Один компонент имеет таблицу html, а за этой таблицей - коллекция backbone.js.
Любые изменения в этой коллекции должны привести к обновлению таблицы html, поэтому я пишу

this.collection.bind("reset add remove", this.renderRows, this);    

Итак, я обновляю таблицу html, когда вся коллекция становится новой, когда новая модель добавляется и когда модель удаляется.

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

changeModel = this.collection.get(id);

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

changeModel.set(attrs); 

и вернуться в таблицу html. Модель в коллекции имеет правильные измененные значения.

Но таблица html не обновляется, поскольку ни одно из трех событий (reset, add, remove) не было запущено.

Итак, я добавил "заменить" на привязку коллекции

this.collection.bind("replace reset add remove", this.renderRows, this);

и перед возвратом из подробного представления я назвал

this.collection.trigger("replace");

Мое решение работает, но мой вопрос:

Есть ли какое-либо "родное" решение backbone.js, которое уже существует и что я пропустил, и где мне не нужно что-то запускать?

4b9b3361

Ответ 1

События change от моделей доходят до коллекции. (Коллекция _onModelEvent -функция в аннотированном источнике. Этот метод в основном принимает все события из моделей и запускает их в коллекции.

Это приводит к

  • Атрибут модели установлен
  • Триггеры модели change
  • Коллекция уловов change
  • Триггеры коллекции change

Итак,

this.collection.bind("replace reset add remove", this.renderRows, this); 

необходимо заменить на это

this.collection.bind("change reset add remove", this.renderRows, this);

Надеюсь, это поможет!

P.S.

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

UPDATE

И теперь вы должны использовать метод on для привязки к событиям.

collection.on("change reset add remove", this.renderRows, this);

Если вы используете BB 1.0, и это событие прослушивается в пределах View, я предлагаю перейти к использованию нового listenTo для привязки в событиях, что также позволяет легко отпереть при вызове view.remove(). В этом случае вы должны сделать:

// assuming this is the view
this.listenTo(collection, "change reset add remove", this.renderRows);