Я пытаюсь использовать систему DI Angular 2, чтобы автоматически обрабатывать зависимости моих сервисов. Я хотел бы использовать аннотацию на самой службе, вместо того, чтобы использовать второй параметр bootstrap()
, чтобы указать все инъекционные услуги.Укажите поставщиков услуг в Angular 2
Что у меня есть
Служба низкоуровневого:
services/role-store.ts
export class RoleStore {
constructor() {
// Initialize roles
}
getById(id) {
// accepts id, returns role object
}
};
Сервис высокого уровня, который зависит от службы низкоуровневого:
services/user-store.ts
import {Injectable} from 'angular2/angular2';
import {RoleStore} from './role-store.ts';
@Injectable()
export class UserStore {
constructor(roleStore: RoleStore) {
this.roleStore = roleStore;
// Initialize users
}
roleForUser(user) {
let role = this.roleStore.getById(user.roleId);
return role;
}
};
Компонент, который зависит от службы высокого уровня:
components/user-dir.ts
import {Component, View, CORE_DIRECTIVES} from 'angular2/angular2';
import {UserStore} from '../services/user-store';
@Component({
selector: 'user-dir',
bindings: [UserStore]
})
@View({
template: '<!-- inline template -->',
directives: [CORE_DIRECTIVES]
})
export class UserDir {
constructor(data: UserStore) {
this.userStore
}
// other methods...
}
Корневой компонент для начальной загрузки:
app.ts
import {Component, View, bootstrap} from 'angular2/angular2';
import {RoleStore} from './services/role-store';
import {UserDir} from './components/user-dir';
@Component({
selector: 'app'
})
@View({
template: '<user-dir></user-dir>',
styleUrls: ['./app.css'],
directives: [UserDir]
})
class App {}
bootstrap(App, [RoleStore]);
Проблему
bootstrap(App, [RoleStore])
работает, но я предпочел бы аннотацию в user-store.ts
, которая сообщает Угловому, чтобы ввести RoleStore
.
Нечто вроде @Provide(RoleStore) class UserStore {}
.
Любые советы?
Был выполнен запрос [pull request] (https://github.com/angular/angular/pull/4154), который делает это или аналогично, но он был закрыт как какой-то режим ожидания. –
Извините, я не понял себя :(Этот PR не был принят. Вы можете спросить в том же выпуске, если они пересмотрят его. –
@EricMartinez Не беспокойтесь, я понял вас (я просто сделал плохую работу * сам * ясно ;))! Я уверен, что это не помешает обновиться до альфа-44. Если это произойдет, исправьте проблему, отлично. В противном случае я рассмотрю оригинальный вопрос и посмотрю, смогу ли я его оживить. –