Pull to refresh

Comments 52

Наезды на JSX выглядят приблизительно так:

Pascal плох, так как поддерживает уйму вариантов итерации: repeat-until, while-do, for-do

А в $mol вообще нет циклов! Посмотрите, как элегантно итерировать через хвостовую рекурсию!

P.S.: Сколько постов не выходит, а вы все никак не уяснили. Ну нельзя продвигать свою технологию обсирая все и вся походу.

Как ты относишься к мнению что тс не даёт той добавочной полезности, сколько для этого забирает? Rescript не ковырял?

Я считаю людей, выступающих против стат типизации в 2к21, проф непригодными.

Rescript не ковырял, но сходу вижу, что это не очень практичный язык:

Belt.Int.toString(n) ++ " times"

не выступающих против, не находящих тех преимуществ, на которые приходится тратить усилия. То есть по прошествии времени сидя на ts особо не прониклись его преимуществом.
А в каких бы решениях не использовал бы ts? Ну где бы он был по твоему особо не нужен?

Там Илья рассказывает какие-то странные истории.

От рантайм ошибок не спасёт никакой тайпчекер. Если фреймворк не умеет с ними работать и замалчивает не показывая пользователю, то это беда фреймворка. Это, кстати, один из плюсов pull семантики - вы не сможете пропустить райнтайм ошибку, показав вместо неё пустоту или предыдущее значение.

В примере со спредом, система типов ТС не различает унаследованные и собственные поля, а некоторые JS апи это различают. Это следствие не слабости типизации, а несоответствие рантайма и системы типов. По хорошему надо закинуть в тс фичереквест на добавление полям атрибута derived по аналогии с readonly. Тогда можно будет типизировать спреды в соответствии с поведением рантайма.

В любом случае сомнительно, чтобы обращение к несуществующему методу могло корраптить базу данных, а не аварийно завершать исполнение. Если же это было действительно так, то в архитектуре есть куда более серьёзные проблемы.

Опять же, если тесты не падают на коде, который в принципе не может не кинуть исключение, то это свидетельствует о том, что тестами данная функциональность не покрыта была вообще.

Наконец, демонизация any. В условиях, когда функция принимает что угодно, any - вполне нормальный выбор. Простой пример, где без any не обойтись:

let x : ( a: ??? )=> 1 = ( a: 1 )=> 1

От части поэтому в тайпингах алгоритмических библиотек можно встретить очень много any.

В условиях, когда функция принимает что угодно, any — вполне нормальный выбор. Простой пример, где без any не обойтись:

let x = ( a: unknown ) => 1 as const

Представьте, что x - это параметр функции.

По хорошему добавить бы в тс нормальную реализацию ко- и контр- вариантности, возможность избавиться от номинальной типизации - и тогда можно было бы разговаривать :)

Я не против строгой типизации, я против тайпскрипта как полумеры :)

А разве в ТС не структурная типизация?

Опять вы даёте ссылку без комментариев. Кстати, на том сайте ещё и полоса прокрутки сломана.

Я не против строгой типизации, я против тайпскрипта как полумеры :)

дарт?

Кстати, @xanf, пока ты думаешь над ответом, можешь скинуть ссылку на своё выступление про программный анализ jsx? Не могу его найти.

А в каких бы решениях не использовал бы ts? Ну где бы он был по твоему особо не нужен?

Я сначала не использовал TS в своих разовых поделках на ноде для личного применения.
А потом понял, что во-первых с TS в ноде нынче стало всё сильно лучше, а во-вторых ничего не мешает мне написать any там, где в разовой задачке надо что-то сделать в развесистой структуре данных, которую типизировать — ну совсем лишний труд.
Итого теперь я и в разовых домашних поделках на ноде использую TS.

 в прошлом именно HTML был языком коммуникации между клиентом и сервером. Поэтому серверу нужно было генерировать именно его.

А что имеется ввиду под коммуникацией?

Человек машина или клиент сервер? Если втрое то вроде бы нет, языком были post get и простые методы http протокола

Второе, конечно.
HTML - Hyper Text MarkupLanguage
HTTP - Hyper Text Transfer Protocol

Практика показывает, что набор императивных правил почти всегда удобнее и проще для понимания, чем увесистое декларативное дерево. Сравните, к примеру, императивный Gulp c декларативным Grunt или монструозный декларативный конфиг Webpack, особенно ранних версий с симфоневской оберткой вокруг него — Encore. А самое веселье, когда декларативное дерево содержит явно выраженные итерации или рекурсию и разработчики пытаются соблюдать DRY без применения декомпозиции.
Оптимальным же, на мой взгляд, является комбинирование подходов, когда минимальные фрагменты остаются декларативными шаблонами, а все какие-либо структуры формируются императивным кодом.

Сравните, к примеру, императивный Gulp c декларативным Grunt или монструозный декларативный конфиг Webpack, особенно ранних версий с симфоневской оберткой вокруг него — Encore.

В MAM экосистеме весь конфиг сборки выглядит как-то так.

UFO just landed and posted this here

а зачем он нужен, это программный анализ? При разработке клиентской части это не нужно.

Я думаю этот вопрос обычно сводится к тем масштабам, в которых рассматривается проблема.

Например есть страничка, на страничке какой-то инпут поиска, список найденных элементов и пагинация. Вводите значение в инпут, пагинация сбрасывается, новый список подгружается и отображается, и также меняется информация в адресной строке, чтобы пользователь мог осуществлять навигацию по истории поиска. Такую задачу не сложно решить в императивном стиле.

Но теперь представьте что Вам необходимо реализовать 20 таких страницы, при этом инпуты поиска, могут становится какими-нибудь чекбоксами или слайдерами, или даже группами различных инпутов. Пагинация может становится подгрузкой при скроле страницы, и это не говоря про то что все страницы должны выглядеть по разному. При этом каких-то кардинальных изменений в поведении нет, все тот же пользовательский ввод, все тот же вывод списка, все та же навигация по истории. Но эту логику в императивном стиле придется реализовывать каждый раз заново, либо очень сильно раздувать количество параметров и логику какой-то универсальной реализации.

А например еще могут требования в процессе изменится, и допустим на каждой такой странице надо будет добавить возможность представить линейный список в виде какой-нибудь таблицы, с сортировками по полям и т. д. В итоге в таком случае придется еще 20 различных шаблонов реализовать. Плюс для этого вероятно потребуется какое-то существенное количество разработчиков, потребуются различные стандарты разработки, код ревью и все прочее. Но когда количество 20 начинает еще больше расти, или точнее когда само количество таких страниц не рассматривается как существенная метрика, то там еще веселее все начинается.

Но эту логику в императивном стиле придется реализовывать каждый раз заново

С чего бы? Так-то давным-давно изобрели средства переиспользования кода, вроде подпрограмм или даже ООП...

Но вот со средствами переиспользования компонентов веб страниц не все так хорошо. У нас нет даже средств для адекватного наследования. В ангуляре например есть реактивные формы, решающие вопрос синхронизации и валидации, и это отличное решение, но формы это не единственное что может требовать такого же массового применения. А чтобы реализовать что-то вроде реактивных форм, думаю вы согласитесь, что потребуется достаточно много усилий и знаний.

А в чём, собственно, проблема с наследованием? Ну, я понимаю что от шаблона наследоваться невозможно, но этого и не требуется. А вот контроллеры и вью-модели при необходимости отлично наследуются.

Проблем нет. Просто формируя некоторую абстрактную обработку мы собственно и приходим к объявлению каких-то деклараций. То есть в моем примере например можно реализовать это через какие-то сущности вроде NavigablePage, NavigableInput, NavigableList, которые знают как друг друга обнаруживать и как друг с другом взаимодействовать, помимо этого они еще и по какому-то другому внутреннему содержанию могут делать различные вычисления. От этого уже наследуются и какие-то конкретные реализации, и все прочее. Опять же как это происходит в случае с реактивными формами. То есть фактически мы таким образом и получаем декларативные объявления.

В таком случае добавить какую-нибудь NavigableTable, особой проблемы уже не будет. В случае ангуляра для создания подобного есть еще и все специальные средства. Но так как подобная логика требует уже каких-то погружений во внутренности фреймворка, то чаще применяются различные компромиссные решения. А именно, что общие связи каких-то изолированных блоков обрабатываются на уровне связующего компонента страницы, а так как конечные значения в этих связях всегда разные, то и их обработка производится по разному.

С Реактом у меня нет продуктового опыта, но на сколько у меня есть представления о нем, предполагаю, что там для реализации подобного вывода, потребуются уже какие-то функциональные абстракции. Которые могут быть не самыми очевидными и точно так же будут требовать определенных знаний и навыков, то есть новичкам в это не въехать с полпинка, а значит в большинстве случаев будут применяться какие-то более очевидные решения. Это если мы говорим не про ситуации, когда в компании есть только профессионалы высокого уровня.

Что-то сам себе напротиворечил. В общем в первом случае я имел ввиду, именно то что мы не можем наследовать компоненты, с тем связями с другими компонентами, так как мы не можем наследовать шаблоны. Во втором случае сказав что проблем нет, имел ввиду, что каких-то принципиальных проблем действительно нет, эти вязи можно формировать и другими путями, но это гораздо сложнее.

Он мало того, что в несколько раз меньше эквивалентного JSX кода, так из него ещё и легко

Как минимум для меня он не меньше. Он может быть короче, но не меньше. У такого кода огромная когнитивная нагрузка. Хотя возможно это частично связано с отсутствие подсветки, но чтение вот этого куска
$my_example $mol_view
    sub /
        <= Panel $my_bipanel
            left <= input /
                <= Editable $mol_check_box
                    checked?val <=> editable?val true
                    title @ \Editable

У меня вызвало кучу вопросов:
1) Что делают прямые и обратные слэши? Когда они нужны? Почему после sub есть прямой слэш, а перед Editable — обратный? А после $my_bipanel вообще ничего нет
2) checked?val — это одна переменная или две переменные и оператор?
3) Что делают < = и <= >? Это передача параметров компонента? Но тогда почему слева от <=> один параметр checked?val, а справа два параметра editable?val и true? Или Всё таки слева два параметра, а справа — 4?
4) В строке <= Panel $my_bipanel Panel — это компонент, а $my_bipanel параметры? Или Panel — это слот у sub, а $my_bipanel — компонент?
5) Почему оператор? пишется слитно спараметрами, а @ — раздельно.
Итого 5/7 WTF/line. Весьма дофига.

Кстати, насчет JSX и его карго-культа HTML, который хоть и не нужен, но оказался полезен. У JSX есть фундаментальное достоинстве в сравнении с типичными языками шаблонов. JSX предствавляет собой фактически JavaScript (ну или TypeScript) код, записанный в чуть другой нотации. Он не требует никакого контекста для однозначной трансляции в JS. Более того он взаимооднозначно транслируется в JS. Код JS, бывший до этого JSX, всегда можно гарантировано и однозначно перегнать обратно в JSX (ну за мелким исключение в виде короткой записи для булевых параметров со значением true). А из этого следуют некоторые его дополнительные свойства:
— Добавлять JSX в транслятор языка достаточно один раз, вам не придётся портировать в JSX новый синтакстис скажет ES2020 вроде "?." и "??", как приходится делать разработчикам Angular с его языком шаблонов.
— Для JSX кода автоматически будут нормально работать линтеры и большинство правил, касающихся JS.
При всем при этом JSX всё ещё синтаксически похож на HTML. Сочетание всех этих факторов позволет JSX'у постепенно доносить до разработчиков простую мысль: «Отдельный язык шаблонов не особо и нужен.» Просто описывайте иерархию ваших компонентов на том же языке, что и всё остальное. Быстрее всего это как не странно дошло до мобильных и десктоп разработчиков с KotlinUI, SwiftUI и Flutter'ом. При том что сама идея не особо нова и Java код писался внутри JSP ещё хрен знает когда, а PHP вообще изначально был именно языком шаблонов. Но у большинства популярных языков из 90-х было всё очень плохо с декларативным синтаксисом, и специально написанные шаблонизаторы оказались вроде бы короче. Только это было лечением симптомов, а не болезни.

А карго-культ HTML и правда не нужен. По крайней мере синтаксически.

У такого кода огромная когнитивная нагрузка. Хотя возможно это частично связано с отсутствие подсветки

Нет, это связано с тем, что вы не читали ни документацию, ни даже краткое введение в язык. Да даже в песочнице не глянули какой код генерируется. Все ссылки есть в статье.

Он не требует никакого контекста для однозначной трансляции в JS.

Это просто ложь. Мало кто знает нюансы трансляции JSX. И совсем мало людей понимают, как TS это всё типизирует.

вам не придётся портировать в JSX новый синтакстис

Завезут в JS угловые скобки, например, для дженериков и всё, приехали.

Документацию я пытался читать: крикливые тексты (которые ничему не учат), срашные иллюстрации (кои ничего не иллюстрируют), кажется там были гифки и ругательства? Это докуметация? Я ходил по ссылкам с вашего гитхаба, наверное это действительно оно.

Что бы это ни было, это надо сжечь. Стереть всю эту чушь собачью. Показать лицом дружелюбное руководство для начинающих. Сухую исчерпывающую документацию. Принципы работы.

Взять вот хоть эту статью. Я мог бы согласился с вами, что всё везде плохо, кроме вот этого кусочка кода размером с ноготок. Только для этого вам следовало расписать, что собственно эта кучка символов означает.

PS: Я сейчас на птичьих правах на хабре. Интересно, будет ли утвержен этот немного грубый комментарий автором публикации?

Документацию я пытался читать: крикливые тексты (которые ничему не учат), срашные иллюстрации (кои ничего не иллюстрируют)

В документации нет никаких иллюстраций. Только текст и код. Изредка скриншоты бенчмарков.

кажется там были гифки и ругательства

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

Завезут в JS угловые скобки, например, для дженериков и всё, приехали.

В TS уже есть угловые скобки, как для дженериков так и для тайпкастов, но к проблемам TSX это приводит очень редко (и решается парой скобок).

В контексте html, для меня всегда jade/pug был прям отличным решением. Он без проблем понятен и тем кто занимается версткой, и для программистов значительно снижает уровень шума, особенно если обеспечить поддержку для некоторых встроенных синтаксических конструкций. Но это если говорить опять же про композицию DOM элементов. Если требуется композиция чего-то более абстрактного, то при определенных объемах думаю практически все так или иначе приходят к каким-то собственным DSL.


upd. Во фреймворках думаю все эти решения в виде JSX или ангуляровского html, это в первую очередь ориентация на массовое распространение, а не на решение задачи композиции компонент. Хотя мне нравится, что в ангуляре есть средства для создания компонентов/директив высшего порядка, но даже и в таком случае обычно это считается велосипедостроением, хотя мне наоборот кажется что в этом и заключается основная идея фреймворка.

Pug действительно интересен. После него я пересмотрел отношение к сайтам на php. Ведь насадить верстку на тот же водпресс означает, что доработки на верстку будут скорее всего уже на php( компоненты пресса требуют своей семантики, которую на память в верстке так и не вспомнишь ), а макет исходник становится промежуточным одноразовым продуктом, а этого быть не должно.
Не понимаю, зачем нужно изобретать язык шаблонов когда можно использовать JS
html`<div style=${{transform: `translate(${x}px, ${y}px)`}}>
     ${users.filter(u => u.IsActive).map((user,index) => html(user.Id)`
           <user user=${user}/>
     `}
</div>`

HyperHTML
Учить 1 день, скорость хорошая, памяти требует мало. Никакой магии внутри, код библиотеки понять довольно быстро.
Честно пытался понять, что это такое, но ни разу не понял.
Сколько времени потребуется запилить аналогичное приложение?
Кажется что оч долго собирать ТЗ и делать логику.
А в UI не вижу чего-то особо сложного — панельки и формы, график.
В большом приложении UI занимает процентов 10, на мой взгляд. Так что особо не сэкономить на супер удобной связи стейта и dom.
Понял, о чем Вы.
Да, HyperHTML наверное сложнее разобрать на блоки машинным способом и такую штуку наверное сложно написать. Зато он оч похож на HTML и поэтому легче разбивается на блоки человеком (который знает HTML).

Но если говорить про конфигуратор компонентов, то логично ограничиться возможностью выбирать входные данные этого компонента, а не лезть внутрь. Такой конфигуратор сделать несложно, да и он зависит не от языка шаблонов, а от библиотеки для компонентов (custom elements легко конфигурируются до некоторого предела, например)

А что в том конфигураторе, собственно, сложного?

Весьма похоже на HTML, но только это не HTML, чтобы там ни говорили Angular-евангелисты.

Ваш HTML-валидатор, похоже, имеет мнение, отличное от стандартного валидатора. Стандартный валидатор не возражает против ангулярских атрибутов, хотя пишет предупреждения, что эти атрибуты не будут сериализоваться в XML. Вставка кода шаблона в HTML документ в браузере никаких проблем не вызывает, он парсится в DOM без ошибок. Так что ангуляровцы правы: синтаксически это валидный HTML. Семантически же — это расширение, использующее допустимые синтаксические возможности (все эти префиксы и скобочки в именах атрибутов). Так как эти возможности никем до этого не использовались, то и неоднозначности не возникает.


То есть это мало того, что не HTML, так это ещё и вовсе не шаблон.

Это таки шаблон, потому что генерируемый результат имеет в целом ту же структуру (что и есть определение термина "шаблон").


И это таки HTML, поэтому шаблонизаторы/трансформеры/конфигураторы вполне могут десериализовать его текстовое представление в DOM-фрагмент, трансформировать его и, если надо, десериализовать обратно без потерь.


Это — язык для компоновки компонент, мимикрирующий под HTML.

Следом, после ранта про недекларативность реакта, вы пишете:


Чтобы добиться гибкости, но не потерять декларативность, нужно разбивать код компонента на 2 части:
  • Декларативная, где происходит компоновка компонент друг с другом.
  • Императивная, где описывается логика работы.

Так что не так? Шаблоны ангуляра — это первая часть. Т.е. главная претензия — это не то, что он "язык компоновки", а лишь "мимикрия"? Но, как выясняется, это не мимикрия, а расширение, и использование всем известного синтаксиса — это большой плюс, так как снижается когнитивная нагрузка. Вдобавок, использование именно валидного декларативного HTML — это путь к созданию желаемых вами "конфигураторов". Впрочем, к полезности последних у меня крайне скептическое отношение — все визуальные конструкторы UI/code/database, которые я использовал, в конце концов шли в помойку из-за своей ограниченности и слабой расширяемости, и всё возвращалось к "code first" (где есть декларативность через FP или через fluent-style) и, максимум, превью результата.

Ваш HTML-валидатор

Это строгой браузерный парсер. Да, не HTML, а XHTML, конечно. HTML парсер же кушает вообще что угодно, даже если на выходе получится некорректный DOM. В частности, атрибут с решёткой в имени вы прочитать сможете, а поменять уже нет, ибо:

Стандартный валидатор не возражает против ангулярских атрибутов

Вполне себе возражает против любых нестандартных атрибутов:

Это таки шаблон, потому что генерируемый результат имеет в целом ту же структуру

Эти элементы распихиваются по разным слотам в разных поддеревьях, по пути теряя часть атрибутов, а часть приобретая - это совершенно не та же структура.

декларативность через FP или через fluent-style

Это тоже не декларативность. Вас обманули.

Вполне себе возражает против любых нестандартных атрибутов

Только на стандартных элементах вроде div.


В частности, атрибут с решёткой в имени вы прочитать сможете, а поменять уже нет

Да, setAttribute() почему-то ругается, а вот так работает:


$0.attributes.getNamedItem("#input").value = "1234"


это совершенно не та же структура.

Структура печенья тоже совершенно не та же, как у формы для печенья: вместо жёсткого металла — рассыпчатое тесто, дырки какие-то. Но почему-то это всё равно шаблон.


Никто не обещал, что структура должна быть на 100% одинаковая. Она должна быть достаточно похожей в чём-то главном и важном, чтобы людям было проще штамповать повторяющиеся вещи.


Это тоже не декларативность. Вас обманули.

Спор о терминах? Декларативность — это когда некий текст описывает задачу в терминах "существительных" и их отношений. Например, foo.should.be.a('string') — это декларация.


Хранится ли этот текст в файле с расширением .xml, .json или .js — не суть важно, текст есть текст, в любом случае это код на каком-то языке, который должен пройти через парсер и скомпилироваться в набор инструкций.

Только на стандартных элементах вроде div

  1. В моём коде нет никаких div.

  2. В ангуляровых шалонах вы не сможете обойтись без нестандартных аттрибутов даже на div.

Да, setAttribute() почему-то ругается

В тексте ошибки видно почему.

Никто не обещал, что структура должна быть на 100% одинаковая.

В данном случае у вас вместо печеньки получилась яичница в лаваше. Ну а что, состав тот же, а на 100% одинаковой структуры никто не обещал.

Декларативность — это когда некий текст описывает задачу в терминах "существительных" и их отношений. 

Это определение для детей. Попробуйте понять для чего нужна декларативность, тогда поймёте что ею является, а что нет. В статье я целую главу этому посвятил.

в любом случае это код на каком-то языке, который должен пройти через парсер

Также обратите внимание, что если понимать термины столь широко, то недекларативного программирования вообще не существует.

В статье я целую главу этому посвятил.

Вы, наверное, хотели сказать "целую картинку"?

В моём коде нет никаких div

А на скриншоте я читаю: "Attribute [...] not allowed on element div at this point"


В данном случае у вас вместо печеньки получилась яичница в лаваше.

Цитирую ваше определение шаблона:


Шаблон предполагает написание кода сразу на целевом языке, вкрапляя в него специальные управляющие конструкции, которые тем не менее синтаксически согласованы с целевым языком.

Имеем:


  • Angular: целевой язык — HTML, язык шаблона — HTML с вкраплениями управляющих конструкций, синтаксически согласованных с HTML. По вашему определению, это шаблон.
  • $mol: целевой язык — HTML, язык шаблона — view.tree. По вашему определению это не шаблон.

Также читаем:


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

Имеем:


  • Angular: и парсер, и человек легко его распарсят, проигнорировав расширенные атрибуты.
  • $mol: по-моему, несмотря на кучу статей, никто из читателей так и не научился парсить это, чтобы буквально видеть результат.

Это определение для детей. Попробуйте понять для чего нужна декларативность

Чтобы статьи писать и о терминах спорить, по большей части.


если понимать термины столь широко, то недекларативного программирования вообще не существует

Если понимать по-вашему, то единственный образец декларативного программирования — это Лисп. Там всё есть "семантическая структура, которую можно использовать для програмного анализа". Даже императивный код.


На самом деле я считаю, что между декларативным и недекларативным программированием чёткой границы нет. Есть только дикие крайности, вроде "кастомеру нужна гибкость — давайте забацаем всё приложение на декларативных конфигах, чтобы кастомер мог их менять под себя в любой момент; и визуальный дизайнер к нему… {после релиза}… кастомер задолбал, конфиги слишком сложные для него, визуальный дизайнер не помогает, ибо сложность — она в предметной области, она неустранима и тут нужны компетенции; поэтому кастомер не хочет/боится туда влезать и на каждое изменение он бежит к онижпрограммистам из саппорта, и те трахаются с недостаточной гибкостью конфигов и с миграциями; мля, лучше бы закодили, ибо один фиг выходит программирование, только теперь на кривом велосипеде с 0.5 мейнтейнеров вместо нормального языка."

А на скриншоте я читаю: "Attribute [...] not allowed on element div at this point"

На заборе тоже слово из 3 букв написано. Вы сами валидатор откройте и посмотрите, что он пишет, а не спорьте со скриншотом.

Шаблон предполагает написание кода сразу на целевом языке, вкрапляя в него специальные управляющие конструкции, которые тем не менее синтаксически согласованы с целевым языком.

Важное свойство свойство шаблона в статье выделено жирным. Странно, что вы его не заметили.

$mol: целевой язык — HTML, язык шаблона — view.tree. По вашему определению это не шаблон.

Именно так.

если взять парсер целевого языка, то он справится и с парсингом шаблона, просто проигнорировав управляющие шаблонные конструкции, никак их не обрабатывая.

Вы опустили присказку "грубо говоря". Прямо говоря, сейчас вы занимаетесь фигурным цитированием.

Чего вы добиваетесь-то всей это демагогией?

Вы сами валидатор откройте и посмотрите, что он пишет, а не спорьте со скриншотом.

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


<bi-panel class="example">

    <check-box class="editable" side="left" [(checked)]="editable" i18n>
        Editable
    </check-box>

    <text-area #input class="input" side="left" [(value)]="text" [enabled]="editable" placeholer="Markdown content.." i18n-placeholder="Showed when input is empty"
    />

    <div *ngIf="text" class="output-label" side="right" i18n>
        Result
    </div>

    <mark-down *ngIf="text" class="output" side="right" text="{{text}}" />

</bi-panel>

Если удалить этот div и добавить недостающие закрывающие теги для кастомных элементов text-area и mark-down, то ошибки внезапно пропадают, остаются только предупреждения "Attribute [...] is not serializable as XML 1.0."


Важное свойство свойство шаблона в статье выделено жирным. Странно, что вы его не заметили.

Настолько не заметил, что его процитировал, ага.


Вы опустили присказку "грубо говоря".

Угу, она как раз там, где "важное свойство шаблона выделено жирным". Простите, я думал это была настолько важная мысль, что она будет иметь смысл даже без "грубо говоря".


Чего вы добиваетесь-то всей это демагогией?

"Первый приём демагога — назвать собеседника демагогом." (с)


Добиваюсь я того, чтобы читатели не сильно доверяли сильным безапелляционным утверждениям, в основе которых лежат размытые понятия. Я уважаю ваш труд по созданию вашего фреймворка, но не согласен с тем, как он вами продвигается.

Действительно, тогда сори за наезд.

Я давно уже не занимаюсь его продвижением, ибо это бесполезное занятие. Это у корпораций любая статья - это пр-материал, а не желание поделиться идеями.

Sign up to leave a comment.

Articles