Pull to refresh
44
0
Andrew Fedoniouk@csmile

User

Send message
Для разнообразия:

Вот был написал мной в свое время «шаблонизатор»: code.google.com/p/kite/
Объем (в LOC) примерно такой же как у автора, но
1. Компилируемый — идея.
2. {{mustache}} compatible + conditionals
Система подписок описана в jQuery и в каждой статье про pub/sub pattern

Система подписок также является основой Twitter Flight.
Вы абсолютно уверены, что это будут реализовывать именно так? Отслеживать тотально все?


Да, уверен.

Скажем вот список

var list = [  { val:1 }, { val:2 }, { val:3 } ];


Нужно представить live-bound cумму всех полей val в этом списке. Кроме как повесить по observer 'у на каждый элемент ничего не получится. В DOM дереве можно сгенерирвать bubbling событие ибо есть parent/child связь. И поймать это событие на root контейнере. В JS же объектах такого в принципе быть не может — только brute force — каждому объекту по observer.
Да не нужны там никакие callbacks.

Достаточно вставить в код приведенный в моей статье что-то типа этого:

  currentPage.trigger("page:close", currentPageName);
  newPage.trigger("page:open", newPageName);


и пусть кому надо подписываются на эти события. Делов то. Это называется loosely coupled (слабо связанные?) системы.
Еще раз: смотрим на Twitter Flight, он прагматично правильный.
Имеем модель вида
var list = [  
   { id:1 },
   { id:2 }
];

отображаемую на некий repeatable в UI.
Для того чтобы binding работал нужен примерно следующий код
Object.observe( list, function() { ... } ); // list add/remove items observer
Object.observe( list[0], function() { ... } ); // list[0] object property change observer
Object.observe( list[1], function() { ... } ); // list[1] object observer

итого три closures. Это на простой массив объектов-то…

И вот сказ про то как человек бился с ng-repeat.

Воистину, выбираем героический фреймворк чтобы потом героически его бороть.

Даже при наличчи 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 и декораторы функций то код действительно получается чистым.
И это скорее контр-пример ибо UI там вообще никакой да и продукт какой-то уж совсем левый, половина ссылок здесь не работает толком.
Про какие крнкретно «спагетти-коллбэки» идет речь?
Про dirty checking в angularjs и проблемы со списками можно прочитать здесь: habrahabr.ru/post/200670/
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

Или я не понял вопроса.
Критикуя — предлагай.

url hash — ???
single page web application — ???
Критикуя — предлагай.

url hash — ???
single page web application — ???
Я живу и работаю в Канаде. Я просто не знаю как эти слова произносятся в современном русском. Например view в контексте MVC я просто не знаю как озвучить по русски. Буду признателен если кто-то предложит непротивречивый термин.
Для господ дискутирующих предлагается скомпилировать следующий код

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% у вас работает мой код (в том числе конечно).

Information

Rating
Does not participate
Location
Richmond, British Columbia, Канада
Date of birth
Registered
Activity