简体   繁体   English

异步绑定angular2

[英]Async binding angular2

I wanted to bind a value from my component ImageDetail to the component ImageComment like 我想将我的组件ImageDetail中的值绑定到像ImageComment这样的组件

ImageDetailHtml: ImageDetailHtml:

<image-comment [photo]="photo"></image-comment>

ImageCommentComponent: ImageCommentComponent:

export class ImageCommentComponent {
  @Input('photo') photo: Photo;

and show this values into my ImageCommentHtml: 并将此值显示在我的ImageCommentHtml中:

  <h3>{{user.userName}}</h3>
  <h4>{{photo.title}}</h4>
  <p>{{photo.description}}</p>

The problem is, that the data of the photo is loaded after building the ImageCommentHtml and i don't get the values. 问题是,在构建ImageCommentHtml之后加载了照片的数据而我没有得到这些值。 Any ideas orexamples how i can solve this async problem? 任何想法都可以解释我如何解决这个异步问题? I tried very much out and nothing worked. 我非常努力,没有任何效果。

Is there a opportunity to load the child component later? 以后有机会加载子组件吗?

** UPDATE ** Tried the solution: **更新**尝试解决方案:

<image-comment *ngIf="photo" [photo]="photo"></image-comment>

and it still doesn't work. 它仍然无法正常工作。 I added a few loggers: 我添加了一些记录器:

  ngAfterViewChecked() {
    console.log("After view checked: " + 'photo', this.photo)
  }

  ngOnInit() {
    console.log("On Init: " + 'photo', this.photo)
  }

and the result is: 结果是:

On Init: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Photo {}
image-comment.component.ts:42 After view checked: photo Object {photoId: 4, photoName: "#love", photoTitle: "me", photoDescription: null, imageName: "Unbenannt.PNG"…}

So it is still loading to late :( ImageDetailComponent 所以它仍然加载到很晚:( ImageDetailComponent

  //COMPONENTS
    import {Component} from '@angular/core';
    import {Router, ActivatedRoute, Params}    from '@angular/router';
    import {ImageCommentComponent} from './image-comment.component.ts'
    //SERVICES
    import {UserService} from '../services/user.service';
    import {PhotoService} from '../services/photo.service';
    //MODELS
    import {User} from '../models/user.model';
    import {Photo} from '../models/photo.model';
    //SETTINGS
    import {LocalStorageSettings} from '../properties/localstorage.properties';

    @Component({
      selector: 'image-detail',
      templateUrl: 'app/components/image-detail.component.html',
      providers: [PhotoService,UserService]
    })

    export class ImageDetailComponent {
      photo: Photo = new Photo();
      like: string;
      user: User;
      imageUrl: string;



      constructor(
        private photoService: PhotoService,
        private userService: UserService,
        private route: ActivatedRoute
      ) {
        let photoId: any;
        this.route.params.forEach((params: Params) => {
          photoId = +params['id'];
        });
        this.photoService.getPhotoByPhotoId(photoId).subscribe(
          photo => {
            this.photo = JSON.parse(JSON.parse(JSON.stringify(photo))._body);
            this.imageUrl = "http://localhost:8080/images/" + this.photo.imageName;

            this.userService.getUserByName(`${LocalStorageSettings.getLocalUsername}`).subscribe(
              user => {
                this.user = JSON.parse(JSON.parse(JSON.stringify(user))._body);
                if(this.user.likedPhotoList.filter(photo => photo.photoId == this.photo.photoId)[0]) {
                  this.like="Unlike";
                } else {
                  this.like="Like";
                }
              },
              error => console.log(error)
            )
          },
          error => console.log(error)
        )
      }

      goBack() {
        window.history.back();
      }

      likeDisplay() {
        if(this.like == "Like") {
          this.like = "Unlike";
          this.user.likedPhotoList.push(this.photo);
          this.photo.likes+=1;
          this.userService.updateUser(this.user).subscribe();
          this.photoService.updatePhoto(this.photo).subscribe();
        } else {
          this.like = "Like";
          for(let i = 0; i < this.user.likedPhotoList.length; i++) {
            if(this.user.likedPhotoList[i].photoId == this.photo.photoId) {
              this.user.likedPhotoList.splice(i,1);
            }
          }

          this.photo.likes-=1;
          this.userService.updateUser(this.user).subscribe();
          this.photoService.updatePhoto(this.photo).subscribe();
        }
      }
    }

ImageDetailHtml: ImageDetailHtml:

<div class="pusher">
  <div class="ui inverted vertical segment">
    <div class="ui text container">
      <div class="center aligned">
        <img src="{{imageUrl}}" class="ui image  centered" />
      </div>
      <br>
      <div class="ui grid">
          <div class="left floated six wide column" style="cursor:pointer; color:grey;">
            <span (click)="goBack()"><i class="long arrow left icon">Back</i> </span>
          </div>
          <div class="left floated ten wide column right aligned" style=" color:grey;">
            <i class="thumbs outline up icon"></i>{{photo.likes}} &nbsp;&nbsp;&nbsp;
            <a style="cursor: pointer" (click)="likeDisplay()">{{like}}</a>
          </div>
      </div>
    </div>
  </div>
</div>
<image-comment *ngIf="photo" [photo]="photo"></image-comment>

ImageCommentComponent: ImageCommentComponent:

    //COMPONENTS
import {Component} from '@angular/core';
//MODELS
import {User} from '../models/user.model';
import {Photo} from '../models/photo.model';
// SERVICES
import {UserService} from '../services/user.service';
import {AddPhotoService} from '../services/add-photo.service';
import {UploadPhotoService} from '../services/upload-photo.service';
// SETTINGS
import {LocalStorageSettings} from '../properties/localstorage.properties';

@Component({
  selector: 'add-photo',
  providers: [UploadPhotoService, AddPhotoService],
  templateUrl: 'app/components/add-photo.component.html'
})
export class AddPhotoComponent {
  newPhoto: Photo = new Photo();
  photoAdded: boolean = false;
  user: User;

  constructor (
    private uploadPhotoService: UploadPhotoService,
    private addPhotoService: AddPhotoService,
    private userService: UserService
  ) {}

  onSubmit() {
    var userName: string = localStorage.getItem(`${LocalStorageSettings.LOCAL_STORAGE_USERNAME}`);
    this.userService.getUserByName(userName).subscribe(
      user => {
        this.user = JSON.parse(JSON.parse(JSON.stringify(user))._body);
        console.log(this.user);
        this.newPhoto.user = this.user;
        this.addPhotoService.sendPhoto(this.newPhoto).subscribe(
          data => {
            this.photoAdded = true;
            this.newPhoto = new Photo();
          },
          error => console.log(error)
        )
      },
      error => console.log(error)
    )
  }
}

ImageComponentHtml: ImageComponentHtml:

<div class="ui text container">
  <h3>{{user.userName}}</h3>
  <h4>{{photo?.title}}</h4>
  <p>{{photo?.description}}</p>

  <div class="ui comments">
    <h3 class="ui dividing header">Comments</h3>

    <div class="comment" *ngFor="let comment of photo.commentList">
      <div class="ui grid">
        <div class="two wide column">
          <img src="http://localhost:8080/pic/avatar1.png" class="ui image tiny">
          <span class="author">{{photoComment.userName}}</span>
        </div>
        <div class="fourteen wide column">
          <div class="ui blue message">
            <div class="content">
              <div class="text">
                {{photoComment.content}}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <br>
    <div class="ui grid">
      <div class="two wide column">
        <img src="http://localhost:8080/pic/avatar1.png" class="ui image tiny">
        <span class="author">{{user.userName}}</span>
      </div>
      <div class="fourteen wide column">
        <form class="ui form" (ngSubmit)="onSubmit()" #commentForm="ngForm">
          <div class="field">
            <textarea #words rows="3" placeholder="Add a comment" required [(ngModel)]="photoComment.content" name="photoCommentContent"></textarea>
          </div>
          <button type="submit" class="ui red button">Comment</button>
        </form>
      </div>
    </div>
  </div>
</div>

You could use *ngIf directive to make ImageCommentComponent load only after variable photo receives data, not before: 您可以使用*ngIf指令仅在变量photo接收数据之后才加载ImageCommentComponent ,而不是之前:

<image-comment *ngIf="photo" [photo]="photo"></image-comment>

Edit: 编辑:

Problem lies in your ImageDetailComponent - you initialize variable photo : 问题在于您的ImageDetailComponent - 您初始化变量photo

photo: Photo = new Photo();

You should only declare it, like this: 你应该只声明它,如下所示:

photo: Photo;

This way, value of photo will be undefined and ImageCommentComponent won't load until photo receives data. 这样, photo值将是undefinedImageCommentComponent将不会加载,直到photo接收数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM