Сибирские интеграционные системы
AngularSIS #1.18 - https://www.youtube.com/playlist?list=PLmEQRj1_Mt5fkeBYOw1o8k_o8-7POFZJN JavaSIS #2.19 - https://www.youtube.com/playlist?list=PLmEQRj1_Mt5f5MlXGlf5kzldb9Rl8Pwuo
Петров А. С., Павлов М. Ю.
Занятие 1
Цели:
1. Поделиться опытом
2. Подготовиться к грейду на мидла
Темы:
1. Управление состоянием
2. Сложные формы
3. Процесс сборки
4. DI
5. Роутинг
6. ...
7. Profit!
Состояние – любые изменяемые данные, которыми оперирует наше приложение
Примеры:
1. Информация о текущем пользователе
2. Элементы панели быстрого доступа
2. Список задач в журнале
Сервер
URL
Пользователь
SessionStorage
LocalStorage
При изменении ОН:
если выбран ОН, находящийся на уровне выше заданного в настройках основной фильтрации - все настройки основной и дополнительной фильтрации должны сохраняться;
если выбран ОН, находящийся на уровне заданном в настройках основной фильтрации или ниже, но выше уровня заданного в настройках дополнительной фильтрации, то все настройки дополнительной фильтрации должны передаваться в соответствующие настройки основной фильтрации, при этом дополнительная фильтрация должна быть сброшена;
если выбран ОН, находящийся на уровне заданном в настройках дополнительной фильтрации или ниже, то основная и дополнительная фильтрации должны быть сброшены;
если выбран ОН, находящийся на уровне заданном в настройках основной фильтрации или ниже, и дополнительная фильтрация не задана, то фильтрация должна быть сброшена;
Из КТ по аналитике, небольшой пункт
@Injectable()
class DataService {
private records: Record[];
getRecords(): Record[] {
return this.records;
}
setRecords(records: Record[]): void {
this.records = records;
}
}
@Injectable()
class DataService {
private records: Record[];
getRecords(): Record[] {
return this.records;
}
setRecords(records: Record[]): void {
this.records = records;
}
}
@Injectable()
class DataService {
private records: Record[];
private onRecordsChanged: ChangeCallback<Record[]>[] = [];
getRecords(): Record[] {
return this.records;
}
setRecords(records: Record[]): void {
this.records = records;
this.onRecordsChanged.forEach(it => it(records));
}
registerOnRecordsChanged(callback: ChangeCallback<Record[]>): UnregisterCallback {
this.onRecordsChanged.push(callback);
return () => {
this.onRecordsChanged = this.onRecordsChanged.filter(it => it !== callback);
};
}
}
@Injectable()
class DataService {
private readonly records$: Observable<Record[]>;
constructor(http: HttpClient) {
this.records$ = http.get('/rest/data').pipe(shareReplay(1));
}
getRecords(): Observable<Record[]> {
return this.records$;
}
}
@Component({
selector: 'sis-data-view',
templateUrl: './data-view.component.html',
})
export class DataViewComponent {
records$: Observable<Record[]>;
constructor(service: DataService) {
this.records$ = service.getRecords();
}
}
<div *ngFor="let records of records$ | async">
<div>{{record.name}}</div>
</div>
Следует придерживаться использования AsyncPipe, избегать прямых подписок
Поиск
Фильтры
Запрос строк
Строки
Что мы сделаем:
1. Получим строки
2. Добавим фильтр
3. Добавим поиск
4. Добавим паджинацию
1. Декларативно
2. Мощно
3. Реактивно
4. Лениво
Поиск
Фильтры
Запрос строк
Строки
Паджинация
Фильтры
Запрос строк
Строки
Поиск
Паджинация
Фильтры
Запрос строк
Строки
Поиск
/csp/sou/rest/view/query
/csp/sou/rest/view/query
ERROR TypeError: Cannot read property 'a' of undefined at MapSubscriber.push../src/app/shared/journal/main/class-journal-factory.service.ts.ClassJournalFactory.getQueryRequest [as project] (main.9a74b2b….js:66519) at MapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (vendor.9ebaba3….js:246095) at MapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (vendor.9ebaba3….js:241059) at DistinctUntilChangedSubscriber.push../node_modules/rxjs/_esm5/internal/operators/distinctUntilChanged.js.DistinctUntilChangedSubscriber._next (vendor.9ebaba3….js:245041) at DistinctUntilChangedSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (vendor.9ebaba3….js:241059) at ScanSubscriber.push../node_modules/rxjs/_esm5/internal/operators/scan.js.ScanSubscriber._tryNext (vendor.9ebaba3….js:247708) at ScanSubscriber.push../node_modules/rxjs/_esm5/internal/operators/scan.js.ScanSubscriber._next (vendor.9ebaba3….js:247695) at ScanSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (vendor.9ebaba3….js:241059) at FilterSubscriber.push../node_modules/rxjs/_esm5/internal/operators/filter.js.FilterSubscriber._next (vendor.9ebaba3….js:245540) at FilterSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (vendor.9ebaba3….js:241059)
Show 190 more frames
Цель: написать простой журнал
1. https://blog.strongbrew.io/rxjs-best-practices-in-angular/
2. https://medium.com/ngx/why-do-you-need-unsubscribe-ee0c62b5d21f
3. https://rxjs-dev.firebaseapp.com/guide/subject
4. https://rxjs-dev.firebaseapp.com/api/index/function/of
5. https://rxjs-dev.firebaseapp.com/api/index/function/combineLatest
6. https://rxjs-dev.firebaseapp.com/api/index/function/merge
7. https://rxjs-dev.firebaseapp.com/api/operators/scan
8. https://rxjs-dev.firebaseapp.com/api/operators/shareReplay
By Сибирские интеграционные системы
Занятие №1