@angular2Эта группа больше не существует

Страница 38 из 179
abc
25.09.2016
22:05:52
Как у второго ангуляра с рендерингом? Если сравнить по скорости м реактом

Lends
25.09.2016
22:13:21
https://rawgit.com/krausest/js-framework-benchmark/master/webdriver-ts/table.html тут правда старый ангуляр

Alexey
26.09.2016
05:41:12
@injectable ничего не знает про наследования и магии никакой для этого там нет, нужно руками super() дергать и туда передавать все что нужно

Google
Dima
26.09.2016
06:43:29
@injectable ничего не знает про наследования и магии никакой для этого там нет, нужно руками super() дергать и туда передавать все что нужно
спасибо. Но проблема еще в том, что Model не хотелось делать  Injectable, чтоб самостоятельно создавать инстансы, а не только при создании модуля. И в коструктор ее помимо сервиса передавать объект с данными для модели. constructor(data, @Inject(Http) http:Http) ругается при создании инстанса

Alexey
26.09.2016
06:54:27
Не совсем понимаю зачем тебе такое могло потребоваться, это можно отдельно обсудить. Есть 2 решения в лоб

Alexey
26.09.2016
06:56:33
1) Model не injectable, и ты ему всегда сам передаёшь в конструктор все зависимости, как их получить в том месте где ты создаёшь инстанс - твои проблемы

2) сделать injectable сервис ModelFactory, со всеми зависимостями и реализовать статический метод ModelFactory.new()

Он будет создавать инстанс Model, прокидывать в конструктор все зависимости и возвращать этот инстанс

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

Ты хочешь видимо объединить модель и http для неё в одном классе

Типа как в rails модели active record.

Но так делать не надо

Dima
26.09.2016
07:02:53
с рельсами не знаком, но похоже что да, именно это и хочу сделать. Наседовать модель от транспорта. Почему так делать не нужно?

Alexey
26.09.2016
07:06:37
Потому что модель это просто данные её я бы советовал использовать только для отображения. А вся бизнес логика, т.е взаимодействие с API по http должна быть отдельно реализована в сервисах

Пример - юзера

Google
Dima
26.09.2016
07:07:17
это вы говорите о viewModel - я хотел нечто другое

Alexey
26.09.2016
07:07:20
Ты делаешь обычный класс User , не injectable

Dima
26.09.2016
07:07:28
как раз бизнесс-модель

Alexey
26.09.2016
07:07:35
И отдельно UserService

Не должно быть понятия бизнес модель, есть сервисы

Для этого

И они синглтоны

Зачем их плодить инстансами?

Dima
26.09.2016
07:11:47
в идеале их и не буду плодить, все в транспорте, а модели уже отличаются

Алексей
26.09.2016
07:11:57
User и UserService - way to go.

Dima
26.09.2016
07:12:32
Я так на 1м писал, и это не особенно удобно. Есть подходы лучше

Alexey
26.09.2016
07:13:57
Приведи пример кода тогда с подходом получше

Dima
26.09.2016
07:17:32
это уже философия ))) транспорт на самом деле один - в вашем подходе как раз плодятся транспорты для каждой модели, когда должны плодится настройки одного и того же транспорта.

Алексей
26.09.2016
07:17:46
Dima
26.09.2016
07:18:46
в основном, да, ngResource использовал. RestAngular не зашел

но это как раз то, как я делать больше не хочу

Alexey
26.09.2016
07:30:27
там вся логика по работе с Http

плодятся чистые view-классы User без DI

Dima
26.09.2016
07:31:04
так моделей же много и для каждой свой транспорт.

Google
Alexey
26.09.2016
07:31:18
нет

не нужен для каждой свой транспорт

Dima
26.09.2016
07:31:47
я имею ввидку не инстансов User<

а разные классы моделей. Обычно кроме логинки есть еще что-то

User -> UserService, Address -> AddressService

Alexey
26.09.2016
07:33:04
конечно, UserService для работы с rest сущностью /users, ArticleService для работы с /articles

что с этим не так?

Dima
26.09.2016
07:33:14
можно наследовать все сервисы от отдого траспорта, но я хочу еще больше

то, что транспорт по сути один и меняется только урла

Alexey
26.09.2016
07:34:28
ты ошибаешься, не надо делать один GodHttpService который отвечает за все

дальше я дискутировать даже не буду

тут нет предмета для дискуссии

Dima
26.09.2016
07:36:11
ну нет так нет

Alexey
26.09.2016
07:36:15
ты сам придумал этот паттерн?

или где-то увидел?

Dima
26.09.2016
07:40:22
Моделей с транспортом? Бэкбон, экста, ember data. Active records вы же сами привели в пример. Паттерн сервисов на средненьком проекте разросся в штук 30 классов для работы с апишкой.

Alexey
26.09.2016
07:51:12
ну мотивацию я вашу понял, и если у вас действительно прям везде одинаковый стандартный CRUD без излишеств может быть в вашем частном случае это и будет оправдано

Ilya
26.09.2016
07:51:13
Relay тыкали?:)

Alexey
26.09.2016
07:51:28
я же пытался рассуждать обобщенно

у меня часто бизнес логика сильно отличается у разных сущностей

Google
Alexey
26.09.2016
07:54:29
чтобы немного сократить кол-во сервисов я вложенные ресурсы часто держу в одном сервисе, /deals/ и вложенные deals/:dealId/runs у меня в одном сервисе например

ну и модели Deal и DealRun в одном файле иногда держу если они маленькие

Dima
26.09.2016
07:58:31
Relay тыкали?:)
нет, этож реакт. Там редакс

Ilya
26.09.2016
08:00:06
Сам подход я имею в виду и релей и редакс никак не связаны

Алексей
26.09.2016
08:02:53
чуваки хочу сделать такую штуку - class Model extends HttpManager - соответственно у меня 2 класса объявлены - Model и HttpManager. В конструктор первого я передаю данные для модели, а во второй инжекчу Http из @angular/core. Как такое реализовать? Что-то напрямую не получается и погуглить тоже.
http://plnkr.co/edit/uZQAY3czjM8Y048VO1oM?p=preview вот что можно сделать ( по первых нельзя использовать Inject если ты хочешь использовать именно конструктор - обьекты придется создавать и реквайрить в ручную ) export class HttpManager { constructor() { } makeRequest() { //.. } } import {HttpManager} from './HttpManager' export class BaseModel { private httpManager; constructor() { this.httpManager = new HttpManager(); } get(id) { return this.httpManager.makeRequest(); } } import {BaseModel} from './BaseModel' export class UserModel extends BaseModel { constructor(id: number, name: string) { super(); this.id = id; this.name = name; } } export class App { name:string; constructor() { this.name = 'Angular2' this.userModel = new UserModel(1,"test"); this.userModel.get(1); } }

если в кратце лучше создать BaseModel у которой будет приватный HttpManager и унаследоваться от нее

Dima
26.09.2016
09:44:06
так легче ж не станет, в его super  нужно будет передавать обязательные параметры. Это не очень гуд.

Igor
26.09.2016
09:44:13
https://www.illucit.com/blog/2016/03/angular2-http-authentication-interceptor/

вот тут расписано, как от Http отнаследоваться

Artem
26.09.2016
09:44:25
Привет. Такой вопрос: делаю // route — это ActivatedRoute this.route.queryParams.subscribe((params) => { console.log(params); }); перехожу на урл с ?q=12 в итоге в консоль валятся 2 сообщения: {} и {q: '12'} И я не понимаю, почему не просто {q: '12'}. И вообще, ошибка ли это в моём коде или в коде ангуляра. Кто-нибудь сталкивался с таким поведением?

Dima
26.09.2016
09:45:27
Унаследуй Http в httpManager
я думал скорее сделать HttpManager Injectable и уже его наследовать, но ангулар так не умеет

точнее он не понимает, что в конструкторе у нас DI и в супер ничего передавать не нужно

Artem
26.09.2016
09:49:36
тогда мне нужно как-то проигнорировать {} при подписке, если после него придёт { a:1 }.

а если не придёт, то не игнорировать. сложновато.

Google
Алексей
26.09.2016
09:57:35
а если не придёт, то не игнорировать. сложновато.
обычно пишут так ( ибо всеравно в приложении нужна валидация параметров ) ngOnInit() { this.querySub = this.router.queryParams.subscribe(queryParams => this.queryParamaterValue = queryParams["queryParameterName"]; if (isValidQueryParameter(this.queryParameterValue)) { // ... } ); } isValidQueryParameter(param) { return param != null } ngOnDestroy() { if (this.querySub) { this.querySub.unsubscribe(); } }

ага, значит, так и должно быть?
а вот должно так быть или нет - посмотрю вечером

Алексей
26.09.2016
10:00:15
filter у rxjs мб?
это для 1 параметра - а queryParams - массив из query параметров

Dima
26.09.2016
10:02:11
Слушай можешь накидать в plnkr.co пример того чего хотелось бы. Пока просто не очень понятно
http://plnkr.co/edit/6aONnrlqxdkpMuTOgO3H?p=preview. Форкнул твой планкер и вроде получилось, упустил момент что HttpManager отдельно создается, а не наследуется. правда из планкера не получается сделать апи кол не в sameorigin, так что проверить не могу.

Алексей
26.09.2016
10:02:57
rxjs fromArray
** DEPRECATED ** ( use "from" instead ) и мне кажеться не очень подходит.. хотя могу быть неправ

Vladimir
26.09.2016
10:05:56
А есть в TS'е эдакий ObservableCollection как в шарпе? Чтобы бросалось событие, что объект внутри коллекции изменен?

Artem
26.09.2016
10:06:05
обычно пишут так ( ибо всеравно в приложении нужна валидация параметров ) ngOnInit() { this.querySub = this.router.queryParams.subscribe(queryParams => this.queryParamaterValue = queryParams["queryParameterName"]; if (isValidQueryParameter(this.queryParameterValue)) { // ... } ); } isValidQueryParameter(param) { return param != null } ngOnDestroy() { if (this.querySub) { this.querySub.unsubscribe(); } }
ага. ну, у меня что-то наподобие этого, только без валидации пока. тоже подписка в ngInit и unsubscribe в ngDestroy. Тут дело в чём, собственно: я делаю аутентификацию через OAuth2. 1) Ангуляровское приложение смотрит в localstorage, есть ли там токен и не просрочен ли он. 2) Если токена нет, делает редирект к провайдеру. 2) Провайдер аутентифицирует пользователя, редиректит обратно, code засовывает в url. 3) Ангуляровское приложение смотрит в queryParams, если там есть code, через ajax получает токен у провайдера. PROFIT. Ну так вот. На третьем этапе, если queryParams пустые, приложение снова пошлёт пользователя к провайдеру за кодом. И мы вывалимся в циклическое получение кода у провайдера. А отфильтровать я не могу, поскольку тогда процедуру аутентификации автоматом при входе в приложение вообще не запустить: ничего попросту не будет срабатывать при пустых параметрах.

Vladimir
26.09.2016
10:06:52
т.е. грубо говоря, у меня есть некий bool в классе, который при изменении должен вызвать метод перерасчета высоты другого контейнера

Artem
26.09.2016
10:06:57
Итого, выхода два: либо кнопочку поместить, которая процесс аутентификации запускать будет, либо запускать аутентификацию не редиректом, а в отдельном окне.

Поэтому мне так хочется от роутера, чтобы он не слал пустой объект в случае, и когда есть параметры, и когда их нет.

Vladimir
26.09.2016
10:11:25
при сворачивании/разворачивании задачи нужно пересчитать позиции нижестоящих элементов(для правого контейнера)

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

Алексей
26.09.2016
10:13:03
Поэтому мне так хочется от роутера, чтобы он не слал пустой объект в случае, и когда есть параметры, и когда их нет.
тебе просто всю эту логику нужно вынести в "Guards" import { AuthGuard } from './auth.guard'; export const routes: RouterConfig = [ { path: 'admin', component: AdminComponent, canActivate: [AuthGuard] }, { path: 'unauthorized', component: UnauthorizedComponent } ];

Страница 38 из 179

Эта группа больше не существует Эта группа больше не существует