Size: a a a

Angular - русскоговорящее сообщество

2020 January 15

В

Владимир in Angular - русскоговорящее сообщество
Dmitry Provodnikov
с добрым утром, таким образом создаю переменную с оборудованием
<mat-card *ngIf="allEquipment | async as equipment">
, внутри карты есть цикл
ngFor
, который предназначен для разделения всех данных по типам,  сами данные выводятся в таблицах,
[objectsList]="filterEquipmentByType(type.key, equipment)
. но такой вариант вешает всё приложение после сборки. что я тут сделал не так?
быть может лучше использовать async pipe в конечных точках, а фильтровать сам observable?
подозреваю, что вызов функции в *ngFor в темплейте в этом виноват. Решение - готовить данные заранее в классе компонента.

Любой вызов методов в темплейте приводит к лишним вызовам change detection, это приводит к тормозам
источник

DP

Dmitry Provodnikov in Angular - русскоговорящее сообщество
Владимир
подозреваю, что вызов функции в *ngFor в темплейте в этом виноват. Решение - готовить данные заранее в классе компонента.

Любой вызов методов в темплейте приводит к лишним вызовам change detection, это приводит к тормозам
если выводить данные без фильтрации всё отрабатывает, как может метод filter, который точно работает, вешать приложение, быть может нельзя вызывать его из шаблона?
и дело в том, что раньше я всегда и получал данные внутри компонента, а сейчас хочу сделать используя пайп
источник

В

Владимир in Angular - русскоговорящее сообщество
Dmitry Provodnikov
если выводить данные без фильтрации всё отрабатывает, как может метод filter, который точно работает, вешать приложение, быть может нельзя вызывать его из шаблона?
и дело в том, что раньше я всегда и получал данные внутри компонента, а сейчас хочу сделать используя пайп
Пайп это ок. Метод не ок. Можно ради эксперимента добавить туда консоль лог и посмотреть как много будет вызовов консоли
источник

AB

Alex Bu in Angular - русскоговорящее сообщество
Dmitry Provodnikov
если выводить данные без фильтрации всё отрабатывает, как может метод filter, который точно работает, вешать приложение, быть может нельзя вызывать его из шаблона?
и дело в том, что раньше я всегда и получал данные внутри компонента, а сейчас хочу сделать используя пайп
Можно пайпу дать pure false, но нужно будет аккуратно проверку для данных внутри пайпа сделать, так как он будет отрабатывать как функция в шаблоне
источник

DP

Dmitry Provodnikov in Angular - русскоговорящее сообщество
Владимир
Пайп это ок. Метод не ок. Можно ради эксперимента добавить туда консоль лог и посмотреть как много будет вызовов консоли
вы правы, зацикливается вызов метода, а по какой причине?
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Dmitry Provodnikov
вы правы, зацикливается вызов метода, а по какой причине?
а что в методе у вас?
источник

DP

Dmitry Provodnikov in Angular - русскоговорящее сообщество
извиняюсь за скрин, но что тут может зацикливать?
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Dmitry Provodnikov
извиняюсь за скрин, но что тут может зацикливать?
а в теле метода что там?
источник

DP

Dmitry Provodnikov in Angular - русскоговорящее сообщество
Oleg Safonov
а что в методе у вас?
filterEquipmentByType(typeId: number, equipment: Equipment[]): Equipment[] {
   return equipment.filter(equipmentModel => equipmentModel.parentId === typeId);
 }
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Dmitry Provodnikov
filterEquipmentByType(typeId: number, equipment: Equipment[]): Equipment[] {
   return equipment.filter(equipmentModel => equipmentModel.parentId === typeId);
 }
ну при каждом  вызове filterEquipmentByType возвращается новый массив.
Сделайте вместо вызова метода pipe или вообще из allEquipment через .pipe() из rxjs вытащите данные
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Типа

firstEquipment$ = allEquipment
.pipe(
map(data => data.filter(тут логика фильтрации))
)
источник

DP

Dmitry Provodnikov in Angular - русскоговорящее сообщество
Oleg Safonov
Типа

firstEquipment$ = allEquipment
.pipe(
map(data => data.filter(тут логика фильтрации))
)
в данном случае ведь придется для каждой таблицы использовать
async
, а я как раз стремился один раз его использовать
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Dmitry Provodnikov
в данном случае ведь придется для каждой таблицы использовать
async
, а я как раз стремился один раз его использовать
а сейчас для каждой таблицы вызов метода.

Может тогда подписаться в компоненте на allEquipments например, и при изменении просчитать данные для всех таблицы и разбросать по свойствам компонента и передавать их в таблицы.
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
allEquipment.subscribe(data => {
   this.data1 = data.filter(...);
   this.data2 = data.filter(...);
});


и т.д.
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
но с несколькими async я думаю проблем не должно быть
источник

DP

Dmitry Provodnikov in Angular - русскоговорящее сообщество
Oleg Safonov
allEquipment.subscribe(data => {
   this.data1 = data.filter(...);
   this.data2 = data.filter(...);
});


и т.д.
вы правы, спасибо за советы, переделаю тогда сейчас, с несколькими async
источник

OS

Oleg Safonov in Angular - русскоговорящее сообщество
Dmitry Provodnikov
вы правы, спасибо за советы, переделаю тогда сейчас, с несколькими async
👍
источник

В

Владимир in Angular - русскоговорящее сообщество
Dmitry Provodnikov
вы правы, зацикливается вызов метода, а по какой причине?
Так работает CD, не нужно использовать методы в темплейтах. Вариантов два:
1. Готовить данные в компоненте перед обращением к ним из темплейта
2. Писать пайп
источник

S

STEVE in Angular - русскоговорящее сообщество
Smooth Operator
всмысле с пакетами
Парни всем привет
источник

S

STEVE in Angular - русскоговорящее сообщество
как то можно разметку из ребенка вытащить в родителя?
источник