1

私はかなり単純なセットアップだと思ったものを持っています。プロファイル入力コンポーネントでユーザー プロファイルを作成しています。次に、フォームが送信されてユーザーが作成された後、ユーザーを profile-img-upload コンポーネントに送信して写真を追加したいと考えています。これは、作成したプロファイルをプロファイル サービスに保存し、そのプロファイルを img-upload コンポーネントで呼び出すことで実現できると理解しています。しかし、img-upload コンポーネントconsole.log(this.profile)に到達するとプロファイルが常に null になるため、何かが欠けています。

ここで、サブスクリプションとオブザーバブルの核となる何かを誤解しているように感じます。私がやりたいことは、最初のコンポーネントでプロファイル オブジェクトを作成し、作成したプロファイルを 2 番目のコンポーネントに渡して、写真をアップロードしてプロファイルに割り当てることだけです。

誰かが私がここで欠けているものを理解するのを手伝ってくれますか?

プロファイル入力.コンポーネント

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);
    }
 }

profile-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);
   }
 }
4

2 に答える 2

0

サブスクリプションから返されたデータを参照するコードをサブスクリプション コールバックに移動する必要があります。このコールバックは、オブザーバブルからデータが到着したときに呼び出されます

 ngOnInit() {
    this.profileService.pushedData.subscribe(
        (value: Profile) => {
            this.profile = value;
            console.log("this.profile in img upload is");
            console.log(this.profile);
        });
     }
 }
于 2016-08-09T20:30:27.317 に答える
0

私が抱えていた問題は、オブザーバブルの使用方法の誤解によるものでした。プロファイル データから画像をアップロードしたい領域に移動するために、別のページにリダイレクトしていました (新しいコンポーネントを含む新しいテンプレートをリロード)。これは欠陥のある概念でした。私がそれを修正した方法は、次のことを行うことでした:

  1. アップロード用の 2 番目のコンポーネントとテンプレートを削除し、そのすべてのコードをプロファイル作成コンポーネントに組み込みます。

  2. いくつかの ngIf ステートメントを追加して、ユーザーがさまざまなタスクを実行することに基づいて、プロファイル作成ページのさまざまな領域をいつ表示するかを決定します (つまり、プロファイル情報の入力とプロファイル オブジェクトの作成、写真の追加、ビデオの追加など)。

これらのことを行うことで、私は常に同じページにいたので、1 つのアクションの結果を参照して別のアクションで使用することができました。物事が完了したら、アプリケーションの状態とユーザーに表示される内容を制御する変数を設定できました。

テンプレートの最終的なコードは次のとおりです。

<script src="profile-input.component.ts"></script>
<section class="col-md-8 col-md-offset-2">
  <form [hidden]="formSubmitted" [formGroup]="profileForm" (ngSubmit)="onSubmit()">

    <div class="row">
      <div class="col-xs-12">
        <div class="form-group">
          <label for="first_name">First Name</label>
          <input
            type="text"
            id="first_name"
            class="form-control"
            formControlName="first_name">
        </div>
      </div>
    </div>
    <div class="row">
      <div class="col-xs-12">
        <div class="form-group">
          <label for="last_name">Last name</label>
          <input
            type="text"
            id="last_name"
            class="form-control"
            formControlName="last_name">
        </div>
      </div>
    </div>


    <div class="row">
      <label>UserType</label>
      <input type="checkbox"  id="producer" class="form-control" formControlName="producer" >Producer<br>
      <input type="checkbox"  id="client"   class="form-control" formControlName="client" >Client<br>
      <input type="checkbox"  id="creative" class="form-control" formControlName="creative" >Creative<br>
    </div>


    <button type="submit" class="btn btn-primary" [disabled]="!profileForm.valid" >{{ !profile ? 'Add Profile' : 'Save Profile' }}</button>
    <button type="button" class="btn btn-danger" (click)="onCancel()" *ngIf="profile">Cancel</button>
  </form>
</section>

<!-- image upload START-->
<section [hidden]="!imgUploadVisible" class="col-md-8 col-md-offset-2">
  <h2 *ngIf="createdProfile">Welcome {{createdProfile.first_name}}!</h2>
  <p>Now lets get a look at you.</p>
  <hr>
  <h2>Profile Image Upload</h2>
  <input type="file" (change)="imgFileChangeEvent($event)" placeholder="Upload file..." />
  <br>
  <button type="button" (click)="uploadImg()">Upload Image</button>
  <hr>

  <div *ngIf="uploadFile" >
    Uploaded File Path: {{ uploadFile }}
  </div>
  <div class="row">
    <div class="col-xs-12">
      <div class="img" *ngIf="uploadFile">
        <img [src]="uploadFile" width="200px" alt="">
      </div>
    </div>
  </div>
  <br>
  <button [hidden]="!uploadFile" type="button" (click)="sendToS3()">Send TO S3</button>
  <hr>
  <div *ngIf="s3LocString">
    S3 Location: {{s3LocString}}
    <br>
    <img [src]="s3LocString" width="200px" alt="">
  </div>

  <button type="button" (click)="imgUploadComplete()">Next</button>

</section>
<!-- image upload END-->


<!-- Video upload START-->

<section [hidden]="!vidUploadVisible" class="col-md-8 col-md-offset-2">
  <h2>Upload Profile Video</h2>
  <p>Now show us what you can do.</p>
  <hr>
  <h2>Demo Video Upload</h2>
  <input type="file" (change)="vidFileChangeEvent($event)" placeholder="Upload file..." />
  <br>
  <button type="button" (click)="uploadVid()">Upload Video</button>
  <hr>

  <div *ngIf="vidUploadFile" >
    Uploaded File Path: {{ vidUploadFile }}
  </div>
  <div class="row">
    <div class="col-xs-12">
      <div class="vid" *ngIf="vidUploadFile">
        <video autoplay controls [src]="vidUploadFile"></video>

      </div>
    </div>
  </div>


</section>

プロファイル入力コンポーネントの重要な部分は次のとおりです。

  uploadImg() {
    console.log('this.createdProfile before upload');
    console.log(this.createdProfile);
    this.uploadFileService.makeFileRequest("http://localhost:3000/upload", this.createdProfile.profileId, this.imgFilesToUpload, 'profileImg')
      .subscribe(
        (result) => {
          console.log('result in prof input action removed is');
          console.log(result);
           this.imageUploaded = true;
           this.formSubmitted = true;
           this.uploadFile = result.obj.path;
           this.uploadObject = result.obj
        },
        (error) => {
          console.log('We are in error');
          console.error(error);
        });
  }

  uploadVid() {
    console.log('this.createdProfile before upload');
    console.log(this.createdProfile);
    this.uploadFileService.makeFileRequest("http://localhost:3000/upload", this.createdProfile.profileId, this.vidFilesToUpload, 'profileVideo')
      .subscribe(
        (result) => {
          console.log('result in prof input action removed is');
          console.log(result);
          this.vidUploaded = true;
          this.vidUploadFile = result.obj.path;
          this.vidUploadObject = result.obj
        },
        (error) => {
          console.log('We are in error');
          console.error(error);
        });
  }

  sendToS3() {
    console.log('uploading to S3');
    console.log(this.uploadObject);

    this.uploadFileService.sendToS3(this.uploadObject, this.createdProfile.profileId, this.uploadObject._id)
      .subscribe(
        data => {
          console.log(data);
          this.s3Location = data;
          this.s3LocString = data.Location;
        },
        error => {
          console.log(error);
        }
      );
  }

これが他の誰かがこれらの概念をよりよく理解するのに役立つことを願っています.

于 2016-09-09T20:20:19.057 に答える