Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вместо того, что бы сделать так, что бы все работало без плагинов.
Плюсов от прототипного наследования никаких не вижу.
что это как не помещение логики в представление
<div onclick="DB.query('update table1 set field1 = 1 where field2=2')"></div><div onclick="this.style.top='1px;'"></div>{% for item in list %}
<div class="item {% if item.draft %} item--draft {%endif %}">
{{ item }}
</div>
{% endfor %}
<div class="item"
ng-repeat="item in letter.list"
ng-class="{'item--draft': item.draft}"
>
{{ item }}
</div>
Под подлагивает я имею ввиду ситуацю, когда на полупустом экране, в хроме страница меняется не во время нажатия мышкой, а ощутимо после отпускания мышки.
Извините, но ваша статья похожа на «заметки белок истеричек».
Тратить своё время, чтобы рассказать ему обо всех его ошибках в Angular?
Но дебагинг в среде, построенной на асинхронных событиях от браузера, вообще штука печальная
До сих пор отсутствуют директивы для Drag and Drop событий
Когда вы пишите на ангуляре вы помещаете логику в ваш HTML
Гугл не использует AngularJs для своих основных продуктов
Гугл может передумать и закрыть этот проект.
Например при первой загрузке пользователь видит {{ выражения в скобочках }}
Если бы вы прошли хотя бы официальный tutorial, вы бы знали как это решается.Автор пишет что решение есть, но есть один большой нюанс… Могли бы обойтись и без решения. Т.е. мы сначала создаём проблему, потом создаем её решение, и так много где в ангуляре => что-то не так в архитектуре даже если это помогает что-то решить. Собственно весь пост к этому и сводится, пусть немного истерично, но всё же. И, судя по второй версии ангуляра, разработчики angularjs об этом знают и идут верным путем, но не торопясь(по причинам описанным вами же)
Автор пишет что решение есть
ng-controller="SomeController as OtherName" не более чем синтаксический сахар для избежания путаницы в описаниях контроллеров, и никакого отношения к проблеме не имеет.«ага, тут кликнули по кнопке и изменилась модель, теперь нужно слушать изменения на этой модели и когда она меняется вызывается хэндлер», а не «кликнули на кнопку, вызвался хэндлер»
ДВУСТОРОННИЙ БИНДИНГ — ЭТО НЕ ТО КАК ПРОИСХОДИТ ОБРАБОТКА СОБЫТИЙ В ПРИНЦИПЕ
Еще двусторонний биндинг означает, что изменив что-либо в своем приложении, это тригерит сотни функций
ТО ВЫ ТОЧНО УПРЕТЕСЬ В ЭТО ОГРАНИЧЕНИЕ
Когда вы минифицируете свой код, то он перестает работать
Наследование скопов
сделать одну единственную функцию
трансклюд вообще хрен пойми
Проблемы с людьми
Ну да, если пишешь первую свою директиву, то хрен пойешь, но второй уже должно быть очевидно.
Странно, а я думал что там dirty checking цикл, и изменение переменной абсолютно ничего не триггерит.
$.text, $.html в конце цепочек), также FRP прекрасно дружит со всеми существующими шаблонизаторами.p.s. основная идея Angular Light не в том, что бы «оздоровить» Angular, а в том что бы дать возможность использовать тот самый синтаксис шаблонов (а с ним и директивы + фильтры) без необходимости использовать полноценный фреймворк.Я тут не вижу противоречия. Похоже, что мы с вами говорим об одном и том же. Под «оздоровить» я как раз и имел ввиду «выделить ключевую идею и убрать мишуру».
try {
return this.profiles[this.currentUserId];
} catch (e){
...
}
этой проблемы можно было бы легко избежать просто УБРАВ ВОЗМОЖНОСТЬ НАСЛЕДОВАНИЯ СКОПОВВы имеете ввиду, если бы был один scope на все?
ДВУСТОРОННИЙ БИНДИНГ — ЭТО НЕ ТО КАК ПРОИСХОДИТ ОБРАБОТКА СОБЫТИЙ В ПРИНЦИПЕ
ТО ВЫ ТОЧНО УПРЕТЕСЬ В ЭТО ОГРАНИЧЕНИЕ
ЭТО ПЕРЕСТАЕТ РАБОТАТЬ ПРИ МИНИФИКАЦИИ КОДА
Там вводятся 5 новых сущностей: provider, service, factory, value, constant (непродуманная-архитектура#4).
Дебаггинг
Я не буду объяснять почему так происходит, на эту тему столько статей написано в интернете. И что самое интересное — этой проблемы можно было бы легко избежать просто УБРАВ ВОЗМОЖНОСТЬ НАСЛЕДОВАНИЯ СКОПОВ. Это был бы правильный дизайн. К тому же когда вы используете переменные из родительского скопа, это становится крайне сложно тестировать, странно, что фреймворк, который ставит одной из своих самых сильных сторон легкость тестирования, вводит такую логику.
И что самое обидное — ЭТА СЛОЖНОСТЬ НЕ НЕСЕТ НИКАКОЙ ПОЛЬЗЫ.
Проблемы с людьми
Ужасная документация. Приходится дополнительно гуглить много информации.
До сих пор отсутствуют директивы для Drag and Drop событий (на момент написания этой статьи). Само по себе это не очень большая проблема, но это сигнализирует о продуманности продукта и внимании к деталям.
Когда вы пишите на ангуляре вы помещаете логику в ваш HTML. ng-repeat, ng-show, ng-class, ng-model, ng-init, ng-click, ng-switch, ng-if — что это как не помещение логики в представление. Само наличие такой логики — это не настолько страшно, как то что — это невозможно тестировать юнит-тестами, невозможно продебажить и оттуда не кидаются ошибки
НЕ ИСПОЛЬЗУЙТЕ АНГУЛЯР
Как видно, очень много пунктов пересекаются в сравнении с названными 12 в статье автора, т.е. это — действительно, многими признаваемые системные проблемы.
We are developers, we write and debug code. But Angular is HTML parser. I really don’t want to debug any string based parser instead of my code.
Симфония требует тонн бойлерплейта
Темизация форм хороша до тех пор пока не нужно прикрутить кривой, но нужный скрипт с гитхаба.
Валидаторы в Entity превращаются в тыкву, когда нужно добавить в форму левое поле не связанное с Entity
Наследуется только один форм-тип от другого.
мы не можем просто дернуть глобальный контейнер через хак, засмеют.
Примерно нулевая интеграция фреймворка с клиент-сайдом из коробки
DQL — это зло
Длинные неудобные команды для ассетов, миграций, запуска команд
Симфония это просто квинэссенция идеи делать простые вещи максимально сложным способом.
Во вторых серверные разработчики вообще не будут понимать, что творится на front-end'е и не смогут читать код.Это многое объясняет. Если автор работает в окружении таких дубов, не удивительно, что и сам сделался ретроградом. У нас серверные разработчики за пару месяцев не просто вникли в Ангуляр, но и стали на нем полноценно писать и брать фронтендские задачи (c jQuery, backbone и проч. такого не получалось)
Во вторых серверные разработчики вообще не будут понимать, что творится на front-end'е и не смогут читать код.
Я хочу думать о бизнесс-логике и о том какие задачи мне нужно решить по факту, но я не хочу думать о бессмысленных суррогатных коцептах
наследовании скопов
Если вы опираетесь в своей логике на наследование скопов, то такую логику становиться крайне сложно тестировать (нужно инициализировать еще состояние родительского контроллера).
когда нужно использовать односторонний или двусторонний дата-биндинг
я не хочу решать проблемы производительности
Ангуляр даже накладывает ограничения на то насколько богатый UI можно писать. И что самое интересное, это не какое-то эфемерное и далекое ограничение в которое вы никогда не упретесь. Это всего лишь 2000 биндингов, и если вы разрабатываете более-менее большое приложение, ТО ВЫ ТОЧНО УПРЕТЕСЬ В ЭТО ОГРАНИЧЕНИЕ.
когда нужно использовать compile, link, controller
когда мне нужно использовать value или constant, provider или factory
я не хочу думать о том, зачем нужны Provider для каждой внедряемой сущности и не хочу знать ничего о run и config фазах
я не хочу думать о том, что делать когда я хочу интегировать натинвые события события в мир ангуляр
я не хочу думать о том увидел ли пользователь {{ скобочки }}
ГОСПОДИ, АНГУЛЯР ОТПУСТИ, ВЕДЬ Я НЕ В ЧЕМ НЕ ВИНОВАТ, ДАЙ МНЕ ПОЖАЛУЙСТА ПО ПРОГРАММИРОВАТЬ, МНЕ ЭТО НРАВИТСЯ.
В календаре далеко не один месяц. А в дне, далеко не один час.
С большой вероятностью AngularJS будет выбран потому, что миллион обезьян не может ошибаться
А давайте UX всё же будут заниматься специально обученные UX-еры, а не создатели JS-фреймворка?
Вы тут шутки шутите, а каждый второй проект сейчас начинается на AngularJS отнюдь не по причине его технологического совершенства.
Со временем архитектурные просчёты выбранного фреймворка начинают все сильнее и сильнее бить по рукам. Но к тому моменту уже поздно что-то менять — написано куча кода, не отделимого от фреймворка.
Это всего лишь 2000 биндинговНа jsperf есть тест скорости обработки $watch примитивов для Angular — на моем ноутбуке, Chrome обрабатывает 11М $watch'ей в секунду (1ops = 10k watch), поэтому проблем с 2000 биндингов быть не должно, чаще производительность будет упираться в DOM — а это проблема вне зависимости от фреймворка.
setTimeout(callback, 0) -> callback.call(null), однако поменяв этот кусок обратно, и просто убрав jQuery (который там вообще ни туда, ни суда, т.к. React в дефолтной конфигурации никак не зависит от него), у меня всё равно получается у ангуляра 3321мс на filling и 747мс на update для 10000 на раб. машине против 1589мс на filling и 727мс на update у React. И кстати, имеет смысл сравнивать не только время, но и размер памяти, выделяемый при этом сравнении. У меня angular съедает на 50% памяти больше (37,8Мб у React против 57.1Мб у Angular).<li> на что-то более, например на <li><span class="first">{{ first }}</span></li> при заполнении и на <li><span class="first">{{ first }}</span>, <span class="second">{{ second }}</span></li> после обновления<li> элементыкак считаете?Да, мне тоже интересно, но как минимум этот тест ломать не стоит. Для начала, сделал «набросок» с добавлением DOM.
Но чтобы узнать что поменялось нужно несколько раз прогнать $digest.А вот и нет, в Angular нужно всего лишь прогнать $digest, когда в React.js нужно заново построить целый virtual-DOM (в render), после чего который пойдет в diff-обработчик — это значительно медленней.
Но на этом поприще его уделывает тот же React.
Именно поэтому Angular не годится для написания контроллеров — только для вьюх и годится.
<li ng-repeat="item in list track by $id(item)"
скорее из-за dirty-checking'аНет, dirty-checking очень быстрый — до 10М watch в секунду на современном железе — см. тест выше
не думаю, что facebook будет подделывать тестыНе обязательно подделывать, можно просто сделать «равные» решения, т.е. просто отрисовку нового массива который прилетел с сервера, для React это будет нормально, а для Ангуляра это не оптимально, для него нужно немного не так.
и поставить точку в споре о производительности.xamd, точку можно поставить, но завтра появятся другие люди которые будет доказывать что React.js быстрее. Я в интернете периодический натыкаюсь на сравнения где кривое приложение на Ангуляре проигрывает Реакту.
не найдя идентификатора в объекте он его перерендеривает целиком, вместо обновления текстового значенияДа, если идентификатор не найден или он другой, то объект считается другим — и так оно и есть, поэтому под него создается свой scope и DOM, т.к. предыдущий DOM принадлежит другому объекту и возможно где-то используется.
Данные всё же обычно не поэлементно устанавливаются, а приходят в виде JSON.Во многих приложениях данные прилетают, и пользователь с ними работает без «перерисовки», тут просто задача такая.
В реальном приложении $digest будет пропорционален объёму наблюдаемых данных
А вот что я на нём делал, так это эксель на 2500 ячеек с простыми формулами — мягко выражаясь не летало. А как бы вы это реализовали?По хорошему, большие таблицы делают как «viewport», т.е. строится только видимая часть ~20х30 ячеек с учетом скролинга — т.е. данные подстраиваются под скролинг.
Ангуляр не трекает зависимости, поэтому, чтобы реактивно распространить изменения, ему приходится перебирать все ячейки.Ангуляр должен перебирать те ячейки которые он должен отрисовать, а вам для эксель таблицы нужно применять реактивное программирование.
Ангуляр ничего не делает за 2 мс, да.Ну почему ничего, он отрисовывает таблицу, 2500 ячеек.
Но когда приложение начинает растиТак оно, но приложения так же могут расти не только в сложности, но и в «ширь», т.е. просто увеличивается кол-во несвязанных формочек, и для большинства приложений хватает 2-4 $digest цикла.

2500 ячеек он отрисовывает за четверть секунды.Не нужно указывать именно на Ангуляр, на других фреймворках будет примерно сопоставимое время.

Я думаю было бы классно, чтобы фреймворк позволял мне описывать связи между состояниями без оверхеда в рантайме на их поддержание.
И не заставляйте меня подбирать разные решения для одной и той же задачи синхронизации состояний :-)
POJO не проверит валидность данных (ловить ошибки вы будете не в том месте, где они совершены).
POJO не сообщит об отсутствующем поле (просто вернёт undefined)
После изменения POJO нужно не забывать вызывать $digest для всех зависимых от него скоупов.
в Angular2 derty-checking будет использоваться только как фэлбэк для браузеров не поддерживающих Object.observerКстати на счет Object.observe, он не может покрыть все юзкейсы derty-checking, например {{value()}}, он не сможет отследить что произошло в ф-ии, а вот как раз для массивов может быть эффективно применен (даже мог бы для Angular 1.3+). Так же Object.observer сам по себе медленее (для малых scope), так что вполне возможно derty-checking будет основным в Angular 2, но с максимальным использованием Object.observer.
Потому что необходимо 50000 watch-ей или же 1 watch на структуру из 50000 значений. Особой разницы нет, разве что второй вариант куда экономней.
return currentValue === lastValue;
Сортировка, группировка и фильтрация — это работа модели представления.
$digest повторяется от 2 до 10 раз.Если ничего не изменилось, то $digest, отрабатывает 1 раз, в Angular Light даже если что-то изменилось, то в лучшем случае будет тоже 1 раз.
нужно было следить за данными порядка 50000 значенийДля не стандартных задач можно делать свои директивы которые например будут работать через Object.observe
На jsperf есть тест скорости обработки $watch примитивов для AngularЕсли кому интересно, сейчас в разработке Angular Light + Object.observe, добавил на jsperf первую бета версию, для этого теста Chrome показывает неплохой прирост производительности.
по моему мнению AngularJS изначально не создан для огромных приложенийЧто предлагаете использовать для огромных приложений?
односторонним
Что предлагаете использовать для огромных приложений?
для Огромных, вероятно нужно будет пилить что-то свое на основе Backbone, React…
Да, у количества вотчеров есть рекомендуемый лимит в 2000. Иначе будут тормоза. Это плохо.
Сам по себе цикл дайджеста (вместе с вотчерами) не медленный. Но если постараться, вы можете сделать его таким.
Что касается количество различных вариантов для сервис-провайдера – тут, конечно, с синтаксических сахаром перемудрили.
по моему мнению AngularJS изначально не создан для огромных приложений
Почему вам НЕ стоит использовать AngularJs