2013-06-04 2 views
0

У меня возникла проблема с архитектурой приложения, разработанного в Backbone.события javascript/backbone, когда модель была изменена

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

У меня также есть модель конфигурации , которая имеет несколько атрибутов, она загружается через AJAX (стандартная выборка позвоночника). Атрибуты модели отображаются в интерфейсе с помощью всплывающих окон, меню и т. Д., Чтобы пользователь мог выбрать свои настройки. Когда пользователь изменяет настройку, возможно, многие части приложения должны будут повторно отобразить. Модель конфигурации имеет «состояние» свойство (например, свойство currentPeriod используется среди periods которые были извлекаться с помощью AJAX)

Внутри взгляды, я использую listenTo(this.model, 'change:currentPeriod', this.render), чтобы сделать этот вид повторной визуализации, когда что-то изменяется в конфигурации.

Я установил все свои атрибуты состояния по умолчанию внутри модели :: parse. Проблема в том, что если у меня есть 10 атрибутов для установки (после завершения синтаксического разбора), и, вероятно, каждый из них вызовет некоторые события, многие из них будут выполняться несколько раз (это не то, что я хочу).

Я искал возможность установить атрибуты текущего состояния внутри синтаксиса с помощью опции {silent: true} - тогда никакие события не будут запущены. Я надеюсь, что у некоторых из вас уже была такая же проблема, и существует простое решение. Заранее спасибо!

+0

Я не уверен, в чем вопрос. Вы указываете использование '{silent: true}', когда вы вызываете 'set', чтобы предотвратить события изменений; не то, что вы хотите? – freejosh

+0

@freejosh, no. Я могу использовать x.set ('xxx', value, {silent: true}).Но мне нужно то же самое в функции 'parse', возвращаемое значение будет' set' после того, как функция синтаксического анализа закончена. Или, если есть лучшее решение, я был бы признателен. – ducin

ответ

0

Вы можете либо запустить все события «onSet»/«onChange», либо none; другими словами, вы можете пройти silent: true, или нет, но это двоичный выбор. Вы не можете сказать «set foo, и, кстати, только сгорите это событие, а не одно».

Если вы хотите этот уровень контроля, я бы рекомендовал использовать silent: true, а затем вручную инициировать события, которые вы хотите.

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

+0

Я предполагаю, что у меня есть последний вариант, который вы написали, но я обрабатываю дерево с несколькими сотнями узлов, и это занимает много времени, если его увольняют несколько раз. Я думаю об использовании 'this.attributes.currentPeriod = value' внутри' parse' только для того, чтобы «обмануть» магистраль, чтобы не запускать событие, когда атрибут инициализируется в первый раз. Как вы думаете? – ducin

+0

Это кажется разумным, и документы Backbone, похоже, поощряют такой подход: «Обратите внимание, что [silent: true] редко, возможно, даже никогда, хорошая идея. Передавая конкретный флаг в вариантах обратного вызова вашего события, и предпочитают игнорировать, обычно будут работать лучше ». Еще одна мысль: вы также можете использовать события «перезагрузки» и «изменения», чтобы лучше ориентировать некоторые из ваших обработчиков. – machineghost

0

Во время fetch ссылка на options остается тем же между parse и set, так что вы можете изменить значение options.silent и изменения будут перенесены.

See this fiddle для примера этой работы.

0

Один из способов сделать это - создать прокси-сервер (объект Backbone.Events) и посмотреть на него. Прокси-объект будет прослушивать all на модели и просто ставить в очередь события, выпущенные моделью (исключая дублирующие события), пока модель не выполнит событие «Я не закончил» (которое вы запускаете в конце parse); то прокси-сервер будет отключать все события в очереди и очищать очередь.

Смежные вопросы