Верно ли я понимаю что если в компоненте (RandomCpm) я инджектю сервис A, который в свою очередь инджектит сервис B, а может быть еще и он что то инджектит(C,D.etc), то в провайдерах такого компонента RandomCpm я долженуказать все эти сервисы(A,B,C,D...), а не только сервис А? и маленький подвопрос про зависимости, если я в компоненте SubRandomCpm явно не укажу провайдеры то подтянутся все эти парентовые провайдеры под парентовым инстансом?
Нет, естественно надо указать только то, что будешь внедрять непосредственно в сам компонент. А можно даже не указывать ничего, если сервис ты регистрируешь глобально в функции bootstrap.
Вообще логика такая: все сервисы, которые внедряются, должны каким-то образом быть зарегистрированы. Те сервисы, которые ты зарегистрировал глобально в функции bootstrap будут доступны глобально во всех компонентах. Их необязательно описывать в поле providers. Если сервисы не регистрируются глобально, то нужно регистрировать в компоненте. Причём сервисы будут доступны и в дочерних компонентах.
Вообще, у каждого компонента свой инжектор зависимостей. Таким образом, для каждого компонента можно настроить провайдеры сервисов по-своему. Если сервис не зарегистрирован у компонента, то его ищут вверх по иерархии компонентов.
bromzh Блин хотя все равно ловлю трейсы, поэтому на всякий переспрошу, если сервис А который мы указываем в провайдерах к компоненту зависит от сервиса B, то компоненте знать об этом совершеннно не обязательно и сервис B мы не указываем в компоненте?
ГЛЕБ ГЛЕБОВ: В самом компоненте необязательно. Но где-то его нужно указать. Либо в компоненте, который выше по иерархии, либо глобально в функции bootstrap.
Например, если твой сервис UserService зависит от стандартного сервиса Http, то сервис Http (и все его зависимости) так или иначе надо будет зарегать. Разумнее всего сделать это глобально. Стандартные провайдеры обычно группируются в 1 список и экспортируются из пакетов, так что подключить Http и его зависимости просто:
// main.ts
import {HTTP_PROVIDERS} from 'angular2/core';
import {bootstrap} from 'angular2/platform/browser';
import {App} from './app';
bootstrap(App, [
...HTTP_PROVIDERS,
]);
// api.service.ts
@Injectable
export class ApiService {
constructor(private _http: Http) {}
}
// app.ts
@Component({
selector: 'app',
providers: [ApiService], // Http не обязательно указывать, так как он указан глобально
template: `...`,
})
export class App {
}
Я бы рекомендовал делать так:
1) Сервисы, которые нужны почти в каждом компоненте (в том числе стандартные, типа тех, которые содержатся в HTTP_PROVIDERS, ROUTER_PROVIDERS) регистрировать глобально.
2) Сервисы, которые нужны внутри какой-то связанной группы компонентов регистрировать в корневом (для этой группы) компоненте.
2) Сервисы, которые нужны только в 1-м компоненте регистрировать непосредственно в самом компоненте.
При этом, надо убедиться, что все зависимые сервисы были зарегистрированы где-то выше по иерархии компонентов.