У меня есть то, что я считал довольно простой настройкой. Я создаю профиль пользователя в компоненте ввода профиля. Затем После отправки формы и создания пользователя я хочу отправить пользователя в компонент-img-upload для добавления фотографии. Я понимаю, что это имело бы смысл, если бы сохранить созданный профиль в службе профиля, а затем вызвать этот профиль в компоненте img-upload. Но у меня что-то не хватает, потому что, когда я добираюсь до компонента img-upload console.log (this.profile), профиль всегда равен нулю.Angular2 Subscription всегда подходит null
Я чувствую, что я неправильно понимаю что-то очень важное для подписки и наблюдаемых здесь. Все, что я хочу сделать, это создать объект Profile на первом компоненте, а затем передать созданный профиль второму компоненту, чтобы затем загрузить фотографию и назначить ее профилю.
Может кто-нибудь, пожалуйста, помогите мне понять, что мне здесь не хватает?
профиль-input.component
import...
@Component({
moduleId: module.id,
selector: 'my-profile-input',
templateUrl: 'profile-input.template.html',
directives: [REACTIVE_FORM_DIRECTIVES]
})
export class ProfileInputComponent implements OnInit {
@Output() profile: Profile;
profile: Profile = null;
constructor(private formBuilder:FormBuilder,
private profileSrevice: ProfileService,
private errorService: ErrorService,
private router: Router,
private route: ActivatedRoute) {}
onSubmit() {
const profile: Profile = new Profile(
this.profileForm.value.first_name,
this.profileForm.value.last_name
);
this.profileSrevice.addProfile(profile)
.subscribe(
data => {
console.log('what comes back from addProfile is: ' + JSON.stringify(data));
this.profileSrevice.profiles.push(data);
// The line below will superceded the one above.
this.profileSrevice.pushData(data);
},
error => this.errorService.handleError(error)
);
this.router.navigate(['profile-img-upload', {myProfile: this.profile}]);
}
profile.service.ts
import...
@Injectable()
export class ProfileService {
pushedData = new EventEmitter<Profile>();
pushData(value: Profile) {
this.pushedData.emit(value);
console.log('value in service is ');
console.log(value);
}
}
профиль-IMG-upload.component.ts
import...
@Component({
moduleId: module.id,
selector: 'my-profile-img-upload',
templateUrl: 'profile-img-upload.template.html',
directives: [ ROUTER_DIRECTIVES, FILE_UPLOAD_DIRECTIVES, NgClass, NgStyle, CORE_DIRECTIVES, FORM_DIRECTIVES ],
providers: [AWSUploadService, UploadFileService]
})
export class ProfileImgUploadComponent implements OnInit {
@Input() myProfile: Profile;
profile: Profile;
constructor(private uploadFileService: UploadFileService,
private route: ActivatedRoute,
private profileService: ProfileService,
private errorService: ErrorService) {
this.filesToUpload = [];}
ngOnInit() {
this.profileService.pushedData.subscribe(
(value: Profile) => this.profile
);
console.log("this.profile in img upload is");
console.log(this.profile);
}
}
Я пробовал это, когда я это делаю, я на самом деле никогда не вижу, чтобы журнал попадал на консоль, говоря «this.profile in img upload is» – JasonPerr
Последний вывод, который попадает на консоль, является значением ** в сервисе ** а затем объект Profile (исходящий из метода profile.service pushData) – JasonPerr
Трудно получить из нескольких фрагментов кода, что происходит на этапе выполнения. Вы должны знать, что данные доступны только после вызова callback. –