
Alexey
29.12.2016
08:15:37
и наоборот, внутри SegmentsModule не знает ничего про Oauth, о том что нужно все запросы в API делать передавая access_token, следить за экспирацией и т.д
он просто работает с Http, а AppModule уже глобально позаботился о подмене Http на нашу реализацию Oauth2Http
вот это я называю слабая связаность

Andrey
29.12.2016
08:17:04
в твоем коде все нормально, только остались вопросы, какой код все таки в segmets.module

Google


Alexey
29.12.2016
08:17:55
import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { FormsModule } from '@angular/forms'
import { ModalModule, ToggleModule, DateTimePickerModule, SelectModule,
SwitchModule, ChartModule } from '@cleverdata/dmpkit/ng2'
import { SegmentService, StateColorPipe } from './shared'
import { SharedModule } from '../shared'
import { SegmentsListComponent } from './segments-list'
import { SegmentNewComponent } from './segment-new'
import { SegmentFormComponent } from './segment-form'
import { SegmentRowComponent } from './segment-row'
import { SegmentThumbComponent } from './segment-thumb'
import { SegmentRulesModule } from '../shared/attributes'
import { routes } from './routes'
import { SegmentEditComponent } from './segment-edit'
import { SegmentStatsComponent } from './segment-stats'
@NgModule({
imports: [
CommonModule,
FormsModule,
ModalModule,
ToggleModule,
DateTimePickerModule,
SelectModule,
SharedModule,
SwitchModule,
ChartModule,
SegmentRulesModule,
routes
],
providers: [
SegmentService
],
declarations: [
SegmentsListComponent,
SegmentRowComponent,
SegmentThumbComponent,
SegmentFormComponent,
SegmentNewComponent,
SegmentEditComponent,
StateColorPipe,
SegmentStatsComponent
]
})
export class SegmentsModule { }
вот такой
роутер
import { ModuleWithProviders } from '@angular/core'
import { RouterModule } from '@angular/router'
import { DeactivateGuard } from '@cleverdata/dmpkit/ng2'
import { SegmentsListComponent } from './segments-list'
import { SegmentNewComponent } from './segment-new'
import { SegmentEditComponent } from './segment-edit'
export const routes: ModuleWithProviders = RouterModule.forChild([
{ path: '', component: SegmentsListComponent},
{ path: 'new', component: SegmentNewComponent, canDeactivate: [DeactivateGuard]},
{ path: ':id', children: [
{ path: 'edit', component: SegmentEditComponent, canDeactivate: [DeactivateGuard]}
]}
])
заметь что внутри SegmentsModule нет импортов за пределы него, только в ../shared
что логично
в SegmentsModule содержится все для работы с Segments, и все лежит в папке app/segments
http://i.4pcbr.com/i/a0/1CmvWQ.png


Andrey
29.12.2016
08:20:54
с разбиением на бандлы или сегменты все нормально становится и у нас примерно так сейчас и работает все)

Alexey
29.12.2016
08:21:08
это и есть модульность без явных связей

Vadim
29.12.2016
08:21:22
Господа, мой следующий вопрос кому-то покажется очень банальным, тем не менее хорошего решения для него не удалось найти ни в гугле, ни узнать у коллег. Сам же я знаю 2 способа решения данной проблемы, но ни один из них мне не кажется хорошим.
Каким образом стоит подключать стили в, например .styl, чтобы не возникало явления "unstyled content flash"? Это когда после подгрузки приложения долю секунды виден html контент, но он не стилизован.

Alexey
29.12.2016
08:23:05
а в Реакте от бедности обычно структурируют все в одну кучу, /components, /services, /utils, /models, /presenters, /stores, /reducers
и это ад


Andrey
29.12.2016
08:23:40
import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { FormsModule } from '@angular/forms'
import { ModalModule, ToggleModule, DateTimePickerModule, SelectModule,
SwitchModule, ChartModule } from '@cleverdata/dmpkit/ng2'
import { SegmentService, StateColorPipe } from './shared'
import { SharedModule } from '../shared'
import { SegmentsListComponent } from './segments-list'
import { SegmentNewComponent } from './segment-new'
import { SegmentFormComponent } from './segment-form'
import { SegmentRowComponent } from './segment-row'
import { SegmentThumbComponent } from './segment-thumb'
import { SegmentRulesModule } from '../shared/attributes'
import { routes } from './routes'
import { SegmentEditComponent } from './segment-edit'
import { SegmentStatsComponent } from './segment-stats'
@NgModule({
imports: [
CommonModule,
FormsModule,
ModalModule,
ToggleModule,
DateTimePickerModule,
SelectModule,
SharedModule,
SwitchModule,
ChartModule,
SegmentRulesModule,
routes
],
providers: [
SegmentService
],
declarations: [
SegmentsListComponent,
SegmentRowComponent,
SegmentThumbComponent,
SegmentFormComponent,
SegmentNewComponent,
SegmentEditComponent,
StateColorPipe,
SegmentStatsComponent
]
})
export class SegmentsModule { }
А если у нас большой сигмент, который использует большое количество общих компонентов, там кнопки, листы, инпуты и так далее, их обязательно нужно будет все указать здесь?

Google

Alexey
29.12.2016
08:24:06
ты работаешь с каким-то конкретным куском функционала, например с Articles, и бегаешь по проекту в /components/articles/.. в /reducers/articles, models/article ...

Andrey
29.12.2016
08:24:20
Или нужно будет создать декларицию для этого сегмента и там использовать общие компоненты?

Alexey
29.12.2016
08:24:50
нет, там есть SharedModule
из app/shared
все что глобально используется в разных модулях кладем туда

Alexander
29.12.2016
08:25:38
по идее делаешь SharedModule и потом его подключаешь в своих модулях. все эти листы, кнопки будут экспортированы из SharedModule

Alexey
29.12.2016
08:25:55
yep

Alexander
29.12.2016
08:27:29
поэтому когда ты в компоненте из SomeFeatureModule пишешь <my-shared-input> то Angular в какой-то момент смотрит в зависимости SomeFeatureModule, находит там SharedModule и использует из него экспортированные компоненты, пайпы и прочее. в принципе вполне логично все получается

Igor
29.12.2016
08:27:34

Alexey
29.12.2016
08:28:29
в общем модули это наше все, если сомневаешься то надо просто почитать доку
и примеры как структурировать приложения
и профит будет очевиден

Andrey
29.12.2016
08:29:33

Alexander
29.12.2016
08:29:35
меня правда бесит писать declarations в модулях, хотя и понимаю, что иначе видимо ангуляр бы и не узнал, что <cool-input> - это CoolInputComponent из файлика cool-input.component.ts

Andrey
29.12.2016
08:30:31

Alexey
29.12.2016
08:30:32
конечно, в первом ангуляре мы просто регистрировали директивы и компоненты сразу в какой-то моуль
а сейчас наоборот, модуль регистрирует в себя компоненты и директивы

Andrey
29.12.2016
08:31:07

Alexander
29.12.2016
08:32:08

Andrey
29.12.2016
08:32:28

Google

Alexander
29.12.2016
08:32:38
по-моему до модулей нужно было явно прописывать в @Component его зависимости от других компонентов
ага, ок. а то я на секунду испугался :)

Lends
29.12.2016
08:35:35
Знатно вас реактовец затролил))

Alexey
29.12.2016
08:36:41

Igor
29.12.2016
08:55:08

Lends
29.12.2016
08:57:01
просто доставляет, что всё началось с того, что крайней удобную и крутую фичу принижают, ибо в реакте не так))
"каждый раз в модуле прописывать"... ?

Alexey
29.12.2016
08:57:30
не принижают а не понимают с непривычки
не надо во всем видеть троллинг

Lends
29.12.2016
09:00:52
тогда скучно будет жить)

Igor
29.12.2016
09:28:17
Привет всем, вопрос к тем кто использует ngrx/store, ощутим ли профит от этого подхода? или в итоге дает только лишний оверхед ? Я просто до этого redux не использовал, и пока не могу все цело осознать нужно ли оно, не усложнится ли код от этого

Mikhail
29.12.2016
09:30:00

Igor
29.12.2016
09:31:54
меня честно говоря пугает, что в reducer'ах начнут пухнуть switch/case конструкции, и количество reducer'ов тоже не померно будет множится, при это их надо как то складывать рядом, групируя по модулям

Mikhail
29.12.2016
09:34:15
Но у тебя будет связанность данных. Достаточно прочитать про преимущества одного стора
Просто сейчас без swtich/case ты будешь как делать? Создавать новые функции? Дополнительно передавать куччу параметрво в одну функцию?
С таким подходом стора у тебя становится атомарный такой подход (если можно так назвать)
Так что попробуй :)

Igor
29.12.2016
09:43:43
А это вообще нормально использовать один экшен в разных редуцерах?

Nikita
29.12.2016
09:56:01
Привет. Подскажите пожалуйста, можно ли передать модель в ParentService?
Допустим у меня есть BaseService с таким кодом:
@Injectable()
export class BaseService {
url: string;
constructor(public globals: AppService,
public http: Http) {
}
get(): Promise<any> {
const url = `${this.globals.apiUrl}/${this.url}/`;
return this.http.get(url)
.toPromise()
.then(res => res.json())
}
}
В ChildService я наследую BaseService
@Injectable()
export class ChildService extends BaseService {
constructor(public globals: AppService,
public http: Http) {
super(globals, http);
this.url = 'works';
}
}
Вот тут я хотел бы передать модель, что бы использовать ее в обещании вместо any
или это лишнее и можно обойтись указанием типа в компоненте, который использует метод гет?


Igor
29.12.2016
10:04:01
Сделай генерик
@Injectable()
export class BaseService<T> {
url: string;
constructor(public globals: AppService,
public http: Http) {
}
get(): Promise<T> {
const url = `${this.globals.apiUrl}/${this.url}/`;
return this.http.get(url)
.toPromise()
.then(res => res.json())
}
}
Потом когда чайл будешь инжектить, просто тип укажи:
construct(private childService: ChildService<MyModel>) {}

Google

Igor
29.12.2016
10:06:53
https://www.typescriptlang.org/docs/handbook/generics.html

Gleb
29.12.2016
10:08:45
хм вот недавно доклад был
ща в закладках пороюсь
там про ООП Store
без свитч кейс тоже упонималось

Igor
29.12.2016
10:09:29
я сделал без свитчкейсов, я в экшены засунул код о_О

Gleb
29.12.2016
10:09:30
https://www.youtube.com/watch?v=wi3wPzReKZQ

Igor
29.12.2016
10:10:12
спасибо, гляну

Gleb
29.12.2016
10:10:25
https://vsavkin.com/managing-state-in-angular-2-applications-caf78d123d02#.gnu1z0gck
вот еще
ниже код
вернее ссылка на гтитхаб
https://github.com/corasla/angular2-tackling-state-rxjs
вот кароч
другое дело что там самого ngrx нет
ну то есть там просто самоСтор
но разницы особой нет
Скажите пожалуйста я чтот найти не могу, как вернуть в rx массивом обзервы?

Igor
29.12.2016
10:13:42

Gleb
29.12.2016
10:13:56
ну что то вроде $q.all в первом и с промисами

Google

Gleb
29.12.2016
10:14:06
только в rx и с обзервами

marat
29.12.2016
10:20:07

Gleb
29.12.2016
10:20:17
такс нукась
Ну вообще да но вот в этом контексте как бы применить
@Effect()
removeLayerWithMetadata$: Observable<Action> = this.actions$
.ofType(layers.ActionTypes.REMOVE_LAYER_WITH_METADATA)
.map((action: layers.RemoveLayerWithMetadata) => action.payload)
.mergeMap(layerWithMetadata => this.mapApi.mapDeleteById(layerWithMetadata.layer.id))
СЮДА БЫ ЕЩЕ ОДИН ЗАПРОС добавить

marat
29.12.2016
10:26:19
что ожидаете получить?

Gleb
29.12.2016
10:27:03
нее я имею ввиду на ровне с this.mapApi.mapDeleteById хочу добавить еще
this.metadataApi.mapDeleteById
то есть два запроса сделать и потом уже экшн

marat
29.12.2016
10:29:34
можно так попробовать
.mergeMap(layerWithMetadata =>
Rx.Observable.forkJoin(this.mapApi.mapDeleteById(...), this.metadataApi.mapDeleteById(...))
)
только результатом будет не Observable<Action>, а Observable<Array<Action»

Gleb
29.12.2016
10:31:17
Да гуд! @malborov Спасибо!

marat
29.12.2016
10:31:27
пожалуйста

Anton
29.12.2016
11:10:55
Ребят,такой вопрос
есть задача написать видеоплеер который бы сам менял качество как на ютубе
и вот вопрос в том,как измерять скорость
чтобы он понимал когда надо повышать качество,а когда понижать

Alexander
29.12.2016
11:17:56
можно попробовать при старте кидать обращение на какой-то твой хэндлер, который отдает 10К данных без gzip и прочих радостей. замерять время и на этом основании делать выводы о качестве интернета
время замеряешь между отправкой запроса и получанием этих всех тестовых данных
костылище конечно, но другого способа пока не приходит в голову, который не связан с изменением/внедрением в раздающий веб-сервер

Anton
29.12.2016
11:22:47
окей,спасибо,попробую

Igor
29.12.2016
11:23:01
смотри просто на буфер
если буферизазция идет медленно, переключай на более низкое качество
Эта группа больше не существует