#angular
#angular
Вопрос:
У меня есть ProjectModule. Для каждой страницы в этом модуле требуется projectService.projectData
свойство перед загрузкой.
ProjectComponent
ngOnInit() {
this.af.auth.subscribe(auth => {
this.route.params.forEach((params: Params) => {
let name = params['name'];
if (name) {
this.projectService.getProject(name);
}
});
});
}
ProjectService
getProject(name) {
//Friendly URL to ID
this.af.database.object('/friendly_urls/' name).take(1).subscribe((data) => {
//ID to data
this.af.database.object('/projects/' data.$value).take(1).subscribe((projectData) => {
this.projectData = projectData;
});
},
error => {
console.log(error);
/* TODO: Permission blocked page */
this.router.navigate(['']);
});
}
Я должен создать getProject(name)
метод в каждом компоненте, чтобы получить данные проекта.
Как я могу убедиться, что получаю projectData
от службы перед доступом к любому маршруту?
Возможно ли достичь этого без subscribe
обслуживания в каждом компоненте ngOnInit
?
Комментарии:
1. Вы уже сохраняете данные в
projectData
свойстве сервиса. Просто получите доступ к этому свойству в ваших компонентах. т.е.export class SomeComponent { constructor(projectService: ProjectService) { }
затем любым методом в компоненте, которому нужны данные, простоthis.projectService.projectData
. Если вы запуститеgetProject
метод на ранней стадии процесса загрузки, данные будут доступны для приложения. Просто убедитесь, что вы не объявляете массивProjectService
в каждом модулеproviders
, только в главном модуле, поэтому вы работаете с одноэлементной службой.2. Да, я сохраняю его в
projectData
. но когда я пытаюсь использовать ProjectData в одном из моих компонентов, я получаю, чтоprojectData
значение не определено. Я спрашиваю, как я могу избежать подписки в каждом компоненте3. Включаете ли вы ProjectService в поставщиков каждого модуля? или просто в файле самого высокого модуля (
app.module
может быть?). Если у вас есть это, скажем, вapp.module
, а затем в более низком модулеproject.module
, то вы создаете новый экземпляр службы в каждом модуле.4.У меня это есть только в моем более высоком модуле (ProjectModule). Допустим, вы обновляете страницу по адресу
/projects/my-project/users
.ngOnInit()
метод в моем вопросе выполнен, и времени недостаточно, пока я не получу данные, покаProjectUserComponent
ngOnInit()
метод не будет выполнен сprojectData
.5. Если вы вызываете
getProject()
один раз вProjectComponent
, то вам не нужно вызывать его снова вProjectUserComponent
. ПростоProjectUserComponent
ссылайтесь наprojectData
свойство сервиса. Вы можете заставить его обрабатывать это какnull
/undefined
, пока данные не вернутся с*ngIf
или?
оператором, подобным{{projectData?}}