【问题标题】:Display Specific Detail When Click View Button in Angular 4在Angular 4中单击查看按钮时显示特定细节
【发布时间】:2017-09-07 12:24:37
【问题描述】:

我需要帮助才能使这个“查看详细信息功能”发挥作用。首先,我有用户组件,我想模仿它的工作原理。就像您在尝试获取特定事物时必须访问其服务一样。但是用户组件不是来自 api。现在,我想在我的新闻组件中模仿它,详细信息来自 api。我如何访问新闻组件的特定事物详细信息?我已经把下面的代码放在用户组件和新闻组件上。谢谢你的帮助。

user.service.ts

import { User } from './user.model';
import { Subject } from 'rxjs/Subject';
export class UserService {

usersChanged = new Subject<User[]>();

  private users: User[]= [
    new User('Harry', 'James', 99999889),
    new User('Thomas', 'Baker', 99638798)
  ];

  getUsers() {
    return this.users.slice();
  }

  getUser(index: number) {
    return this.users[index];
  }

用户列表组件

import { Component, OnInit } from '@angular/core';
import { User } from '../user.model';
import { UserService } from '../user.service';
import { Router, ActivatedRoute } from '@angular/router';

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

  users: User[];
  index: number;

  constructor(private userService: UserService, private router: Router, private route: ActivatedRoute) { }

  ngOnInit() {
      this.users = this.userService.getUsers();
      this.userService.usersChanged
      .subscribe(
        (users: User[]) => {
          this.users = users;
        }
      );
  }

  onViewUserDetail(index: number){
    this.router.navigate(['users', index]);
  }

news.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders} from '@angular/common/http';
import 'rxjs/add/operator/map';

@Injectable()
export class NewsService {
    constructor(private httpClient: HttpClient) {
  }

getNews() {
    const authToken = localStorage.getItem('auth_token'); 
    const headers = new HttpHeaders() 
    .set('Content-Type', 'application/json') 
    .set('Authorization', `Bearer ${authToken}`);

    return this.httpClient
      .get('sample/news', { headers: headers })
      .map(
        (response => response));
}


getNewsDetail(index: number) {
    //
  }

news-list.component.ts

import { Component, OnInit } from '@angular/core';
import { NewsService } from '../news.service';
import { Router, ActivatedRoute } from '@angular/router';


@Component({
  selector: 'app-news-list',
  templateUrl: './news-list.component.html',
  styleUrls: ['./news-list.component.css']
})
export class NewsListComponent implements OnInit {
  newslists: any;
  constructor(private newsService: NewsService, private router: Router, private route: ActivatedRoute) { }

  ngOnInit() {

    this.newsService.getNews()
      .subscribe(
        (data:any) => {
          console.log(data);
          this.newslists = data.data.data;
          console.log(this.newslists);
        },
        error => {
          alert("ERROR");
        });
  }

  onViewNewsDetail(id: number){
    console.log(id);
    this.router.navigate(['news', id]);
  }

}

【问题讨论】:

    标签: angular angular-services angular-http angular-http-auth


    【解决方案1】:

    不太明白问题出在哪里。您正在导航到详细视图 onView***Detail() 方法。如果您已经正确定义了路线,它应该转到相应的组件。在那个细节组件 ngOnInit() 中,你可以订阅激活路由的 paramMap 并调用 api 或从 store 中获取值,但是你想要。

    ngOnInit() {
            this.paramSubscription = this.route.paramMap
                .switchMap((params: ParamMap) => this.userService.getUser(+params.get('id')))
                .subscribe(
                res => {
                    this.user= <User>res;
                },
                err => console.log('error retreiving user detail')
                )
    
        }
    

    您将在您的详细信息组件的用户属性中获得详细信息,并且您可以根据需要显示它。

    更新

    要获取新闻的详细信息,您可以创建一个带有行为主题的新闻商店,该主题将调用您获取所有新闻的服务 - 列表。你的组件也可以调用这个商店。该商店将公开您的私人行为主题的 getter,将其公开为 Observable。

    然后您可以随时通过 getValue() 访问主题值,而不必再次调用 api 来进行任何查看详细信息调用。请参见下面的示例:

        @Injectable()
        export class NewsStore {
            private _news: BehaviorSubject<List<News>> = new BehaviorSubject(List([]));
    
            constructor(
                private newsService: NewsService) {
                this.loadInititalData();
            }
    
            get news() {
                return this._news.asObservable();
            }
    
        getNews(id: number): any {
                return this._news.getValue().filter(news=> news.id == id);
            }
    
    loadInititalData() {
            this.newsService.getAll()
                .subscribe(
                res => {
                    let news= res;
                    this._news.next(List(news))
                },
                err => this.handleError(err, "loadinitialdata")
                );
        }
        }
    

    【讨论】:

    • 我的用户组件没有问题。用户是我想效仿的一个例子。用户没有 api。刷新页面后它就消失了。我的问题出在新闻组件上。它的工作原理是这样的,如果您单击新闻,它会显示新闻列表。在每个新闻列表中,都有一个名为“查看”的按钮,点击后将显示该特定新闻的详细信息。新闻列表来自 api
    • 所以问题出在服务中的 viewDetail() 中?
    • 是的。新闻组件的ViewDetail()
    • 那么我可以从这个 NewsStore 调用新闻列表,因为我正在从服务调用新闻列表吗?
    • 是的,这是推荐的。只有商店应该调用服务,其余所有组件都应该调用商店。您可以从商店订阅 news,因为它是可观察的。您可以轻松地将它与异步管道一起使用。只要做 newsStore.news |在你的 component.html 中异步,确保在你的 component.ts 中注入 store blog.angular-university.io/… 这是一个很好的教程
    【解决方案2】:

    我做到了。

    getAllNews() {
    
        if(this.newslist != null) {
          return Observable.of(this.newslist);
        } 
    
        else {
          const authToken = localStorage.getItem('auth_token'); 
          const headers = new HttpHeaders() 
          .set('Content-Type', 'application/json') 
          .set('Authorization', `Bearer ${authToken}`);
    
          return this.httpClient
            .get('samplei/news/', { headers: headers })
            .map((response => response))
            .do(newslist => this.newslist = newslist)
            .catch(e => {
                if (e.status === 401) {
                    return Observable.throw('Unauthorized');           
                }
    
            });
        }
      }
    
    
      getNews(id: number) { 
        return this.getAllNews().map((data:any)=> data.data.data.find(news => news.id === id)) 
      }
    

    【讨论】:

    • @JayDeeEss。这是我做的?怎么样?
    猜你喜欢
    • 2019-11-15
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2019-12-14
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多