Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вот так вот просто. Собственно именно по этой причине такая интересная концепция как Object.observe была исключена черновиков стандарта. Ну что, все еще думаете что нам так уж нужен $scope?Фактически вы убрали реактивное взаимодействие, заменив его на интерактивное. Это работает в простейших линейных случаях: делаем то, потом это, а затем ещё кое что. Но сложность экспоненциально растёт с каждым ветвлением логики. Статья про атомы иллюстрирует этот процесс. Реактивное программирование — это ж чуть ли не единственное достоинство ангуляра, по сравнению с остальными фреймворками. Зачем вы так жестоко с ним? :-)
Как вы думаете, какое значение будет выведено? Явно не то что мы хотели.Как раз именно то. Не понимаю, почему вы хотите тут что-то другое. Другое дело, что инициатором любого биндинга должен быть внешний компонент, а не внутренний. И именно эту проблему надо решать, а не вводить сомнительные односторонние биндинги, которые приводят лишь к такого рода тавтологиям: on-item-select="$ctrl.selectedItem = selectedItem" selected-item="$ctrl.selectedItem"
Мульти-слот трасклюдНу каконец-то. Хотя, в итоге рендерится слишком много элементов. Если мне надо поместить в слот другой компонент, то у меня будет 1 элемент для слота, 1 элемент для параметра и только внутри него будет вложенный компонент. И эти промежуточные элементы придётся дополнительно стилизовать, чтобы прокидывать ширину и высоту.
Только javascript! В этом основное преимущество dirty checking-а между данными и представлением, а не между представлением и DOM, как например в React. Мы полностью отделяем UI от состояния приложения, а такие вещи банально проще тестировать.Это преимущество реактивного программирования, а не грязных проверок. У грязных проверок одно преимущество — простой код. Но они крайне не эффективны. Но вообще говоря, декларативно разделять надо не только view-model и dom, но и model и view-model.
Реактивное программирование — это ж чуть ли не единственное достоинство ангуляра, по сравнению с остальными фреймворками.
Как раз именно то. Не понимаю, почему вы хотите тут что-то другое.
которые приводят лишь к такого рода тавтологиям
И эти промежуточные элементы придётся дополнительно стилизовать, чтобы прокидывать ширину и высоту.
Это преимущество реактивного программирования, а не грязных проверок.
Так, я может чего-то не понимаю, но с каких пор в ангуляре есть реактивное программирование? Мы в каком-то из топиков уже это обсуждали и выяснили, что для FRP ангуляр не очень подходит.Ну, он там корявый, но всё же есть.
В Angular2 для реактивщины используется rx.js.Это даже хуже вотчеров в плане поддержки :-)
Просто вместо двух ватчеров (один создает ангуляр при изоляции скоупов и другой — вы, когда хотите отслеживать изменения внутри директивы) мы теперь используем явный вызов метода при изменении свойства, и остается один ватчер. Инициатором вызова этой функции остается ангуляр, и вызываться он будет исключительно по изменению значения.Представьте себе ситуацию: у вас 3 свойства А1, А2, А3, каждое из которых зависит от каждого (или почти каждого) из 3 других свойств Б1, Б2, Б3. Когда устанавливается значение А1, вам нужно пройтись по всем зависимым свойствам и сказать им обновиться. Поддерживать эти «обратные зависимости» приходится вручную, что неизбежно приводит к ошибкам и неэффективности. Именно с этой проблемой и борется реактивная архитектура. Только в случае FRP (knockout, атомы) зависимость прямая (от зависимого к зависимостям), а в случае стримов (rx.js, bacon.js) обратная (от зависимости к зависимым).
Ну вы дальше в том же абзаце и написали, почему я хочу что-то другое. Компонент верхнего уровня должен спокойно передавать часть состояния вниз и не беспокоиться что его поменяют. Меня не должно парить что происходит внутри компонентов, которые я использую.Только корень проблемы не в двустороннем биндинге, а в месте его объявления. А то, что вложенный компонент _может_ использовать односторонний биндинг, вместо двустороннего, это не решает проблему того, что он _может_ использовать и двусторонний биндинг и напортачить не у себя. К тому же, он с тем же успехом _может_ и не изменять значение, которое пришло ему извне, оставаясь в рамках старого доброго двустороннего биндинга.
Тут — просто пример. В комментариях я пояснил, что это сделано для того, что бы логика «выделять элемент или нет» выносилась на уровень выше. Все же мы хотим сделать реюзабельный компонент.Так это «пример, так делать ни в коем случае не надо» или «вот так и выглядит хороший реюзабельный код»? :-) Меня смущает такая избыточность кода на ровном месте.
Ну это не особо большая проблема. В этом даже можно найти свои плюсы, в том плане, что это более гибкий вариант для стилизации.Это очень большая проблема, потому как механизмы лейаута в хтмл далеки от идеала и нельзя просто вставить обёртку ничего не сломав. Типичные проблемы: не работающий height:100%, разваливающийся flexbox, чем больше элементов, тем менее отзывчивый интерфейс получается (типичный пример — эксельчик).
Ну, он там корявый, но всё же есть.
Это даже хуже вотчеров в плане поддержки :-)
Представьте себе ситуацию: у вас 3 свойства А1, А2, А3, каждое из которых зависит от каждого (или почти каждого) из 3 других свойств Б1, Б2, Б3.
const a1 = Symbol('a1');
// ...
class MyComponent {
set A1 (val) {
// ...
this[a2] = calcA2(this[a1]);
}
set A2 (val) {
// ...
this[a3] = calcA3(this[a2]);
}
// ну или можно было бы одну функцию описывающую переходы замутить
}
Меня смущает такая избыточность кода на ровном месте.
типичный пример — эксельчик
angular.module( 'app' ).component( 'myPanel' , {
transclude : {
myPanelHead : '?head',
myPanelBody : 'body'
},
template: `
<div class="my-panel">
<div class="my-panel-header" ng-transclude="head"></div>
<div class="my-panel-bodier" ng-transclude="body">No data</div>
</div>
`
} )
$my_panel : $mol_block child
< header : $mol_block child < head : null
< bodier : $mol_block child < body =No data
<body ng-app="app">
<my-panel>
<my-panel-head>My tasks</my-panel-header>
<my-panel-body>
<my-task-list
assignee="me"
status="todo"
/>
</my-panel-body>
</my-panel>
</body>
$my_app : $my_panel
head : =My tasks
body : $my_task_list
assignee : =me
status : =todo
angular.module( 'app' ).component( 'myPanelExt' , {
transclude : {
myPanelHead : '?head',
myPanelBody : 'body',
myPanelFoot : '?foot'
},
template: `
<div class="my-panel">
<div class="my-panel-header" ng-transclude="head"></div>
<div class="my-panel-bodier" ng-transclude="body">No data</div>
<div class="my-panel-header" ng-transclude="foot"></div>
</div>
`
} )
$my_panelExt : $my_panel child
< header
< bodier
< footer : $mol_block child < foot : null
— Вас банально не будет рядом, что бы объяснить новому человеку на проекте, как с этим всем жить.
— У проекта не такой большой бюджет что бы нанимать кого-то вашего уровня.
— Опять же отсутствие возможности сегрегации обязанностей между людьми.Наоборот, декларативное описание компонент позволяет разделить зоны ответственности верстальщика и программиста. А хорошая компонентная модель позволяет одного верстальщика разделить на несколько, как и программиста.
В целом же людей, которые могут написать вменяемую систему с использованием таких подходов не особо то и много. Достаточно посмотреть на количество вакансий и зарплаты хаскель/кложа программистов.Это не какой-то новый язык программирования, это ближе к haml-подобному шаблонизатору. А вот логика описывается одноимёнными классами на тайпскрипте.
Ваш «сферический в вакууме» фреймворк не будет мэйнстримом, во всяком случае ближайшие лет пять, пока индустрия не подтянется к этому уровню.Скорее пока какая-нибудь компания не начнёт его продвигать. К сожалению, современная индустрия очень тенденциозна. Сейчас все вакансии по фронтенду пестряд Ангуляром. Но уже появились и первые ласточки, которые наелись ангуляра и ищут что-то другое. Обычно этим другим сейчас выступает Реакт, на котором хоть компоненты можно делать полноценные.
Использовать события скоупов для организации pub/sub в сервисах, или еще хуже, завязывать какую-то логику приложения на них, это очень плохо.
Нужно больше абстракций :-)
Кстати, ждать ли критику Сферического Фреймворка или всё настолько идеально, что и придраться не к чему?
Angular 1.5: Компоненты