как я могу исключить элемент из области Angular?

моя предпосылка была неверной. хотя AngularJS, безусловно, замедлял работу, это было не из-за проблемы, которую я описываю ниже. однако именно ответ flim на мой вопрос — как исключить элемент из области видимости Angular — смог доказать это.

Я создаю сайт, который генерирует графики, используя d3 + Raphael из данных, полученных с помощью AJAX. это приводит к МНОЖЕСТВУ элементов SVG или VML в DOM, в зависимости от того, какой тип диаграммы пользователь выбирает для отображения (например, у круговой диаграммы мало, у линий и полос много).

Я столкнулся с проблемой, когда ввод текста в текстовые поля, контролируемые AngularJS, приводит к сканированию Firefox. Я набираю несколько символов, затем жду 2-3 секунды, пока они внезапно не появятся, затем набираю еще несколько и т. д. (Кажется, Chrome справляется с этим немного лучше).

когда на странице нет графика (пользователь не предоставил достаточно данных для его создания), можно отредактировать содержимое этих текстовых полей. Я предполагаю, что у AngularJS возникают проблемы, когда он пытается обновить DOM, и ему приходится просматривать сотни элементов SVG или VML.

граф, однако, не содержит ничего, о чем AngularJS должен беспокоиться. (однако есть элементы пользовательского интерфейса как до, так и после графика, на которые ДЕЙСТВИТЕЛЬНО нужно обращать внимание.)

Я могу придумать два решения:

  1. поместите DIV графика вне контроллера AngularJS и используйте CSS, чтобы расположить его там, где он действительно нужен

  2. скажите AngularJS - как-то - не обращать внимания на DIV графика; чтобы пропустить его при сохранении представления и модели в синхронизации

второй вариант кажется мне предпочтительнее, так как он сохраняет макет документа разумным / семантическим. Есть какой-либо способ сделать это? (или какое-то, даже лучшее решение, о котором я не подумал?)


person Ben    schedule 12.06.2013    source источник
comment
Вы пробовали ng-non-bindale? docs.angularjs.org/api/ng.directive:ngNonBindable   -  person Foo L    schedule 13.06.2013
comment
Как вы думаете, почему Angular должен просматривать все элементы SVG/VML? Эти элементы генерируются Angular? Если нет, то Angular на них не смотрит. Angular компилирует документ HTML (DOM) только один раз: docs.angularjs.org/guide/concepts#startup   -  person Mark Rajcok    schedule 13.06.2013
comment
ng-non-bindable — это именно то, что я искал! но это также доказывает то, что сказал Марк: Angular на самом деле не медленный из-за SVG/VML, сгенерированного Raphael. игнорирование этого блока не помогает. поскольку проблема не существует в Chrome, а профилировщик Firebug менее информативен, чем Chrome, трудно точно сказать, где именно замедление... Я продолжу копать. Тем не менее, я действительно хотел бы отдать должное Флиму за ответ на мой первоначальный вопрос.   -  person Ben    schedule 13.06.2013
comment
Я вставлю это в ответ, и вы можете принять это. :)   -  person Foo L    schedule 17.06.2013
comment
@ Бен, привет, ты когда-нибудь узнавал, в чем проблема с замедлением?   -  person Nikos    schedule 07.02.2014
comment
@Nikos Я действительно ничего не помню - извини :| Я хотел бы быть более полезным, но это было несколько месяцев назад, и с тех пор мы работали над несколькими другими проектами (каждый день приходится решать новые проблемы!)   -  person Ben    schedule 13.02.2014


Ответы (1)


Вы пробовали ng-non-bindable? http://docs.angularjs.org/api/ng.directive:ngNonBindable

<ANY ng-non-bindable>
   ...
</ANY>
person Foo L    schedule 17.06.2013
comment
У меня возникли проблемы с экземпляром CKEditor, который содержал переменные шаблона Liquid. Angular интерполировал переменные, хотя ввод не был привязан ни к чему в Angular. Добавление ng-non-bindable исправило это. Спасибо! - person Sean Hill; 13.05.2015