【问题标题】:Faster reload of components in Angular在 Angular 中更快地重新加载组件
【发布时间】:2021-04-28 11:20:33
【问题描述】:

我创建了两个 Angular 组件:一个用于创建新帖子,一个用于显示所有帖子。在我按下创建帖子的按钮后,我被重定向到我的 PostList 组件,其中显示了我的所有帖子。我用了window.location.href,这样PostList页面可以自动重新加载,这样新帖子就出现了,不需要手动刷新。问题是它很慢,实际上需要两次刷新,一次在创建帖子时,一次在刷新帖子列表时。有没有更快的方法来导航到帖子列表并显示新帖子而无需手动刷新页面?如果我使用router.navigateByUrl('/posts'),我必须手动刷新页面以显示新帖子,这是不希望的。

export class PostCreateComponent implements OnInit {

  model: any = {};
  @Output() newContent = new EventEmitter();
   
  publishNewPost() {
    this.postService.createPost(this.model).subscribe(newPost => {
      this.model = newPost;
       this.newContent.emit(model);
      this.router.navigateByUrl('/posts');      
    });
}
}
export class PostListComponent implements OnInit {

  posts: Post[];
  pagination: Pagination;
  postParams: PostParams = new PostParams();

  ngOnInit(): void {
    this.loadPosts();
  }

  loadPosts() {
    this.postService.getPosts(this.postParams).subscribe(posts=> {
      this.posts = posts.result;
      this.pagination = posts.pagination;
     });
  }

 addNewContent(content: Post) { this.posts.push(content) }

}

用于创建帖子:

<form #postForm="ngForm" (ngSubmit)="createPost(this.model)" autocomplete="off">
</form>

帖子列表:

<div  class=" container mt-3" >
         <span *ngFor="let post of posts">
             <app-post-card (newContent)="addNewContent($event)" 
                [post]="post" class="item" ></app-post-card>
         </span>
</div>  

邮政服务:

getPosts(postParams: PostParams) {
    var response = this.postCache.get(Object.values(postParams).join('-'));

    if (response) {
      return of(response);
    }

    let params = this.getPaginationHeaders(postParams.pageNumber, postParams.pageSize);

    params = params.append('orderBy', postParams.orderBy);

    return this.getPaginatedResult<Post[]>(this.baseUrl + 'posts', params)
    .pipe(map(response => {
        this.postCache.set(Object.values(postParams).join('-'), response);

        return response;
    }));

  }
createPost(model: any) {
     return this.http.post<Post>(this.baseUrl + 'posts/create', model);
}

【问题讨论】:

  • 您可以使用@Output 并在创建一个时将您的帖子推送到父组件中的帖子数组中,第二个选项是让 rxjs 主题,在父组件中订阅它,当有变化时,您只需调用 this.posts.push(change) 并在提交帖子时在您的子组件中执行 this.subject.next(post)
  • 我尝试过使用@Output,但可能不行,因为它不起作用。我已经更新了我的答案。
  • &lt;app-post-card (newContent)="addNewContent($event)...&gt; 和你的 ts 文件 addNewContent(content) { this.posts.push(content) },你不需要对你的 loadPosts() 函数做任何事情
  • 好的,所以我已将 addNewContent(content) 添加到问题中的代码中,但它仍然不起作用。 publishNewPost() 的代码可以吗?还是我错过了什么?
  • 看起来不错,您的后端返回插入的帖子吗?在您的publishNewPost() 中尝试console.log(newPost) 以查看您发布的帖子是否从后端返回...如果不是,那么您必须删除this.model = newPost

标签: angular routes refresh


【解决方案1】:

您可以创建一个可用于两个组件之间通信的 PostService。 在该服务中,为各种帖子和一个 behaviorSubject (rxjs) 创建一个帖子列表变量,它会在更新时始终发出帖子列表。

创建一个公共方法以在帖子中附加新帖子。 创建一个公共方法,该方法将作为 observable 返回 behaviorSubject。

邮政服务:

import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';

@Injectable()
export class PostsService {
    private postsList: string[] = [];

    private $posts: BehaviorSubject<string[]> = new BehaviorSubject<string[]>(this.postsList);

    constructor() { }

    public getPostsObservable(): Observable<string[]> {
        return this.$posts.asObservable();
    }

    public addPost(post: string): void {
        this.postsList.push(post);
        this.$posts.next(this.postsList);
    }

}

然后在 AddPost 组件中,订阅上述服务并使用其 addpost 方法。

AddPost 组件:

export class AddPost {

    constructor(private postsService: PostsService) {}

    public addNewPost(post) {
        this.postsService.addPost(post);
    }
}

HTML

<div>
    <input type="text" (change)="addNewPost($event.target.value)">
</div>

ShowPost 组件:

export class ShowPost implements OnInit {

    public postsList: string[] = [];
    
    constructor(private postsService: PostsService) {}
    
    ngOnInit() {
        this.postsService.getPostsObservable().subscribe(postsList => {
            this.postsList = postsList;
        });
    }
}

HTML:

<div>
    <div *ngFor="let post of postsList">
         {{post}}
    </div>
</div>

【讨论】:

  • 感谢您的回答!我已经有一个后期服务,我已经更新了问题中的代码。
  • 您在问题中提到的服务是用于从后端获取帖子。如果您检查我的答案,这是一个单独的可注入服务,用于两个兄弟组件之间的通信。
猜你喜欢
  • 2018-04-24
  • 2020-08-08
  • 2020-10-10
  • 1970-01-01
  • 2018-06-03
  • 2018-08-13
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
相关资源
最近更新 更多