angular - 按 Angular 按日期对对象列表进行排序

标签 angular sorting date http components

我想按日期对 posts 数组进行排序,但首先我想看看 posts 中是否有对象,帖子列表是否正确显示在html 但在 console.log 中它看起来是 undefined。你能帮帮我吗?

posts.component.ts

import { Component, OnInit } from '@angular/core';
import { Post } from '../post';
import { LoginService } from '../login.service';
import { ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
import { PostsService} from '../posts.service';
import { registerLocaleData } from '@angular/common';
import localeIt from '@angular/common/locales/it';

registerLocaleData(localeIt, 'it');

@Component({
  selector: 'app-posts',
  templateUrl: './posts.component.html',
  styleUrls: ['./posts.component.css']
})
export class PostsComponent implements OnInit {

  constructor(private loginservice: LoginService,
              private location: Location,
              private postsservice: PostsService) {}
  posts: Post[];
  postDetail(id: number){}

  ngOnInit() {
    this.getPosts();
    console.log(this.posts);
  }

 getPosts(): void {

   this.postsservice.getPosts()
   .subscribe(posts=>this.posts=posts);

 }


}

post.component.html

<div>
<ul>
  <li *ngFor="let post of posts">
    <p>{{ post.title }}</p>
    <p>written by {{ post.author }}  {{ post.date | date:'medium':'':''}}
      <a class="details" routerLink="/detail/{{post.id}}">></a>
    </p>
    <br>
  </li>
</ul>
</div>

posts.service.ts

import { Injectable } from '@angular/core';
import { Post } from './post';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { HttpClient, HttpHeaders } from '@angular/common/http';

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};

@Injectable()
export class PostsService {

  private postsUrl = 'api/posts';  // URL to web api
  posts = [];

  constructor(private http: HttpClient) { }

  /** GET posts from the server */
  getPosts (): Observable<Post[]> {
    return this.http.get<Post[]>(this.postsUrl)
  }

  getPost(id: number): Observable<Post> {
    const url = `${this.postsUrl}/${id}`;
    return this.http.get<Post>(url);
  }

  /** PUT: update the post on the server */
  updatePost (post: Post): Observable<any> {
    return this.http.put(this.postsUrl, post, httpOptions);
  }

  /** POST: add a new post to the server */
  addPost (post: Post): Observable<Post> {
    return this.http.post<Post>(this.postsUrl, post, httpOptions);
  }
  /** DELETE: delete the post from the server */
  deletePost (post: Post | number): Observable<Post> {
    const id = typeof post === 'number' ? post : post.id;
    const url = `${this.postsUrl}/${id}`;

    return this.http.delete<Post>(url, httpOptions);
  }
}

最佳答案

如果您想检查是否有帖子,您可以使用过滤器。这样,当您订阅可观察对象时,您不需要任何逻辑。

getPosts (): Observable<Post[]> {
    return this.http.get<Post[]>(this.postsUrl)
           .pipe(filter(posts => posts && posts.length > 0));
}

与其在组件的订阅中对帖子进行排序,我更倾向于将逻辑保留在服务中并为此使用 map ,例如。

getPosts (): Observable<Post[]> {
    return this.http.get<Post[]>(this.postsUrl)
           .pipe(
                filter(posts => posts && posts.length > 0),
                map(posts => sortBy(posts, ['date'])
            );
}

在上面的示例中,我只使用了 lodash sortBy 语法,但您可以在映射中使用任何您想要的方法来返回排序后的数组。如果您在其他地方需要未排序的帖子,您可以使用单独的 getSortedPosts 方法,或将参数传递给 getPosts(sortBy)。

关于angular - 按 Angular 按日期对对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50076773/

相关文章:

java - 在没有比较器的情况下对java中的路径名数组列表进行排序

mysql - SQL复杂的select语句?

javascript - Uncaught Error : Can't resolve all parameters for AppComponent: (? )

javascript - 如何修复错误类型错误 : "_co.news is undefined"?

java - 如何在不使用 Collections.sort() 的情况下按值对 LinkedHashMap 进行排序?

php - 在日期范围列表中省略多余的月份和年份

java - 为什么我加了 10 分钟后月份变成了 50?

Angular Service Worker - Rest API 数据

angular - 类型 ‘Navigator' 上不存在属性蓝牙

java - 在j2me中读取文件内容