Вот был написал мной в свое время «шаблонизатор»: code.google.com/p/kite/
Объем (в LOC) примерно такой же как у автора, но
1. Компилируемый — идея.
2. {{mustache}} compatible + conditionals
Вы абсолютно уверены, что это будут реализовывать именно так? Отслеживать тотально все?
Да, уверен.
Скажем вот список
var list = [ { val:1 }, { val:2 }, { val:3 } ];
Нужно представить live-bound cумму всех полей val в этом списке. Кроме как повесить по observer 'у на каждый элемент ничего не получится. В DOM дереве можно сгенерирвать bubbling событие ибо есть parent/child связь. И поймать это событие на root контейнере. В JS же объектах такого в принципе быть не может — только brute force — каждому объекту по observer.
и пусть кому надо подписываются на эти события. Делов то. Это называется loosely coupled (слабо связанные?) системы.
Еще раз: смотрим на Twitter Flight, он прагматично правильный.
Даже при наличчи Object.observer в той форме что он предложен не поможет сделать AngularJS легче.
Для того чтобы заменить $watch функциональность нужно пройтись по всем узлам модели (objects & arrays) и навесить на них по отдельной callback функции с помощью Object.observer.
Для отображения списка с помощью ng-repeat нужно на каждую data item повесить свой scope что превращает задачу отображения списка в праздник для сборщика мусора.
Data binding в принципе может быть полезной вещью в каких-то случаях, просто как он тотально навязан в Angular (либо data binding — либо никак) мне откровенно не нравится.
Кстати я сделал свой неинтрузивный вариант data binding в Sciter в стиле AngularJS. Так как в Sciter есть namespaces, Object.add/removeObserver и декораторы функций то код действительно получается чистым.
Про dirty checking в angularjs и проблемы со списками можно прочитать здесь: habrahabr.ru/post/200670/
Data binding в angularjs требует создания отдельной функции-observer для *каждого* объекта в модели.
Чем более «развесиста» и глубже модель — тем более медленно это всё работает ибо базовые алгоритмы имеют вычислительную сложность O(n*m). Где n — количество элементов данных в модели (объектов и их свойств) и m — количество обозревателей.
При всем при том для базовых операций типа «отобразить список» в 99% случаях совершенно не нужен живой data binding.
Т.е. в этих самых 99% мы платим за то что не используем вообще. В мобильных приложениях плата это расход батареи и пр.
Мое решение оптимально в том числе в смысле расходов — ты платишь только за то что реально используешь.
А MVC… моделью можно считать данные на сервере, в базе данных например. Контроллер — частично в business logic layer (сервер), частично на клиенте. Т.е. то что работает на клиенте есть чистый view и его логика. Почему народ пытается MVCями обозвать скажем angularjs я не понимаю.
А вообще мне как прагматику лично более симпатичен Twitter Flight хотя это и не framework в общем смысле. И кстати Twitter Flight реально работает на twitter сайте. Скажем AngularJS в google продуктах не замечен.
Я живу и работаю в Канаде. Я просто не знаю как эти слова произносятся в современном русском. Например view в контексте MVC я просто не знаю как озвучить по русски. Буду признателен если кто-то предложит непротивречивый термин.
Для господ дискутирующих предлагается скомпилировать следующий код
while(true) {
do_something();
}
с ключами /W4 (warnings level 4) и /WX (treat warnings as errors) в Visual Studio.
Получите ошибку «conditional expression is constant».
Пара моих клиентов именно так компилируют свой код и меня просят. Т.е. у меня лично этот вопрос не стоит вообще.
Я редко пишу на про жизнь но чего-то вдруг захотелось дополнить…
Хотел бы еще пару принципов осветить:
1. Делая свои проекты нужно отдавать себе отчет что высока вероятность что «не стрельнет».
Поэтому код надо проектировать и писать в виде конструктора LEGO — не сложилось одно — сложится из него другое. Нельзя выкидывать написаный код — его надо использовать. Это в принципе близко к принципу модульности в архитектуре но не совсем оно. Под этим принципом на самом деле еще пара смысловых слоев — на откуп читателю.
2. При должном проектировании индивидуальный разарботчик примерно в 10-20 раз эффективнее чем большие команды девелоперов из больших контор. Поэтому не надо боятся конкурировать ни с кем. Вообще здоровая доля самомнения в стиле «Ай да Пушкин, ай да сукин сын» ((С) А.С. Пушкин) не вредна, а даже наоборот.
Про ссылки на проекты…
Мои Sciter, HTMLayout, blocknote.net родились именно как side проекты. blocknote.net вообще писался для жены — не планировал его делать public. По моим скромным подсчетам сумарное количество машин на которых установлен один из моих движков соизмеримо со скажем количеством инталляций Firefox на Windows. Если у вас на машине стоит какой-нибудь антивирус то с вероятностью 88% у вас работает мой код (в том числе конечно).
Вот был написал мной в свое время «шаблонизатор»: code.google.com/p/kite/
Объем (в LOC) примерно такой же как у автора, но
1. Компилируемый — идея.
2. {{mustache}} compatible + conditionals
Система подписок также является основой Twitter Flight.
Да, уверен.
Скажем вот список
Нужно представить live-bound cумму всех полей val в этом списке. Кроме как повесить по observer 'у на каждый элемент ничего не получится. В DOM дереве можно сгенерирвать bubbling событие ибо есть parent/child связь. И поймать это событие на root контейнере. В JS же объектах такого в принципе быть не может — только brute force — каждому объекту по observer.
Достаточно вставить в код приведенный в моей статье что-то типа этого:
и пусть кому надо подписываются на эти события. Делов то. Это называется loosely coupled (слабо связанные?) системы.
Еще раз: смотрим на Twitter Flight, он прагматично правильный.
отображаемую на некий repeatable в UI.
Для того чтобы binding работал нужен примерно следующий код
итого три closures. Это на простой массив объектов-то…
И вот сказ про то как человек бился с ng-repeat.
Воистину, выбираем героический фреймворк чтобы потом героически его бороть.
Для того чтобы заменить $watch функциональность нужно пройтись по всем узлам модели (objects & arrays) и навесить на них по отдельной callback функции с помощью Object.observer.
Для отображения списка с помощью ng-repeat нужно на каждую data item повесить свой scope что превращает задачу отображения списка в праздник для сборщика мусора.
Data binding в принципе может быть полезной вещью в каких-то случаях, просто как он тотально навязан в Angular (либо data binding — либо никак) мне откровенно не нравится.
Кстати я сделал свой неинтрузивный вариант data binding в Sciter в стиле AngularJS. Так как в Sciter есть namespaces, Object.add/removeObserver и декораторы функций то код действительно получается чистым.
Data binding в angularjs требует создания отдельной функции-observer для *каждого* объекта в модели.
Чем более «развесиста» и глубже модель — тем более медленно это всё работает ибо базовые алгоритмы имеют вычислительную сложность
O(n*m). Где n — количество элементов данных в модели (объектов и их свойств) и m — количество обозревателей.При всем при том для базовых операций типа «отобразить список» в 99% случаях совершенно не нужен живой data binding.
Т.е. в этих самых 99% мы платим за то что не используем вообще. В мобильных приложениях плата это расход батареи и пр.
Мое решение оптимально в том числе в смысле расходов — ты платишь только за то что реально используешь.
Замечательна MVCёвинка, и махонька така :)
А MVC… моделью можно считать данные на сервере, в базе данных например. Контроллер — частично в business logic layer (сервер), частично на клиенте. Т.е. то что работает на клиенте есть чистый view и его логика. Почему народ пытается MVCями обозвать скажем angularjs я не понимаю.
А вообще мне как прагматику лично более симпатичен Twitter Flight хотя это и не framework в общем смысле. И кстати Twitter Flight реально работает на twitter сайте. Скажем AngularJS в google продуктах не замечен.
Для поисковиков нужно делать правильный about текст который статически включается в index.htm
Или я не понял вопроса.
урла — dic.academic.ru/dic.nsf/efremova/280613/
:)
Captain, I'd better use «url hash» instead.
url hash — ???
single page web application — ???
url hash — ???
single page web application — ???
while(true) { do_something(); }с ключами /W4 (warnings level 4) и /WX (treat warnings as errors) в Visual Studio.
Получите ошибку «conditional expression is constant».
Пара моих клиентов именно так компилируют свой код и меня просят. Т.е. у меня лично этот вопрос не стоит вообще.
Для MUST, SHALL, SHOULD, etc. есть отдельный RFC: www.ietf.org/rfc/rfc2119.txt
Хотел бы еще пару принципов осветить:
1. Делая свои проекты нужно отдавать себе отчет что высока вероятность что «не стрельнет».
Поэтому код надо проектировать и писать в виде конструктора LEGO — не сложилось одно — сложится из него другое. Нельзя выкидывать написаный код — его надо использовать. Это в принципе близко к принципу модульности в архитектуре но не совсем оно. Под этим принципом на самом деле еще пара смысловых слоев — на откуп читателю.
2. При должном проектировании индивидуальный разарботчик примерно в 10-20 раз эффективнее чем большие команды девелоперов из больших контор. Поэтому не надо боятся конкурировать ни с кем. Вообще здоровая доля самомнения в стиле «Ай да Пушкин, ай да сукин сын» ((С) А.С. Пушкин) не вредна, а даже наоборот.
Про ссылки на проекты…
Мои Sciter, HTMLayout, blocknote.net родились именно как side проекты. blocknote.net вообще писался для жены — не планировал его делать public. По моим скромным подсчетам сумарное количество машин на которых установлен один из моих движков соизмеримо со скажем количеством инталляций Firefox на Windows. Если у вас на машине стоит какой-нибудь антивирус то с вероятностью 88% у вас работает мой код (в том числе конечно).