首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular4阵列观测

Angular4阵列观测
EN

Stack Overflow用户
提问于 2017-10-04 08:14:13
回答 1查看 1.7K关注 0票数 5

我需要从可观察的对象中获取一些数据,以便用于SEO (change & description)。

我通过HTTP从API获得数据。在可观察的物体中得到的数据。

我成功地通过订阅this.radio$来转换可观察到的对象,但是这会导致函数getRadioData的双重请求(片段:字符串)。

可能我需要将可观察的对象转换为Array。

radio-details.component.ts (这里我想得到SEO的meta_title && meta_description变量)

代码语言:javascript
复制
import { Component, OnInit } from '@angular/core';
import { RadioDetails, RadioService } from './../services/radio.service';
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
import { Observable } from 'rxjs/Observable';


@Component({
  selector: 'app-radio-details',
  templateUrl: './radio-details.component.html',
  styleUrls: ['./radio-details.component.css'],
  providers: [RadioService]    
})

export class RadioDetailsComponent implements OnInit {
  radio$: Observable<RadioDetails[]>;
  
  constructor(
    private route: ActivatedRoute,
    private router: Router,
    private service: RadioService    
  ) { }

  ngOnInit() {

this.route.paramMap
.switchMap((params: ParamMap) =>
  this.service.getRadioData(params.get('slug'))
)
.subscribe(
  (data)  => {
    this.radio$ = data;
    console.log("this.radio$ IS: ", this.radio$)
    // HERE I WANT TO get meta_title && meta_description variables for SEO
    // this.radio$ looks like: Object { _isScalar: false, source: Object, operator: Object } 
  }
);   
  }
}

radio.service.ts

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';

export class Categories{
  constructor(
    public title: string, 
    public items: Radio[]
  ){}
}

export class Radio{
  constructor(
    public title: string, 
    public slug: string, 
    public external_url?: string, 
    public isplay?: string,
    public css_class?: string    
  ){}
}

export class RadioDetails{
  constructor(
    public title: string, 
    public player_type?: string,
    public stream?: string, 
    public meta_title?: string,
    public meta_description?: string
  ){}
}

@Injectable()
export class RadioService {
  constructor(private _http: Http) { }

  getAllRadiosData(){
    return this._http.get('http://api.2net.co.il/radio/stations/all_stations.php')
    .map(res => res.json())
  }

  getRadioData(slug: string){
if (slug !== null && typeof slug !== 'undefined' && slug){
      return [
    this._http.get('http://api.2net.co.il/radio/stations/station.php?slug='+slug)
    .map(res => res.json())
  ];
}
  }
}

radio-details.component.html

代码语言:javascript
复制
<article class="page page-radio-detail">
  
      <div *ngIf="radio$ | async as radio; else noRadioFound">
          <div class="playerZone">
              <header class="entry-header">
                  <h1 class="entry-title">
                      <span class="text">
                      Playing now:
                      </span>
                      <span class="radio_title">{{ radio.title }}</span>
                 </h1>
              </header>
              <div class="player-wrapper">
                      <app-radio-player stream="{{radio.stream}}" player_type="{{radio.player_type}}"></app-radio-player>
              </div>
          </div>          
      </div><!-- /ngIf -->
  
      <ng-template #noRadioFound>
          <div class="playerZone noRadioFound">
              <header class="entry-header">
                  <h1 class="entry-title">
                      <span class="text">
                      Select radio station:
                      </span>
                  </h1>
              </header>
              <div class="player-wrapper">
              click on links below:
              </div>
          </div>            
      </ng-template>

      <div class="entry-content">
          <app-radio-categories></app-radio-categories>              
    </div>
</article>

EN

回答 1

Stack Overflow用户

发布于 2017-10-04 10:01:30

在你们帮了我之后,解决办法是:

  1. radio.service.ts中,不需要返回函数、getRadioData(片段: string)中的数组。正确的函数代码必须是:

代码语言:javascript
复制
getRadioData(slug: string){
    if (slug !== null && typeof slug !== 'undefined' && slug){
      return this._http.get('http://api.2net.co.il/radio/stations/station.php?slug='+slug)
      .map(res => res.json());
    }
  }

  1. radio-details.component.html中的收音机$的实现必须没有管道。正确的部分代码必须是:

代码语言:javascript
复制
<div *ngIf="radio$ as radio; else noRadioFound">
...
</div>

  1. 毕竟,在radio-details.component.ts中,我得到了简单易懂的对象,比如{mate_description: "some meta description", meta_title: "some_meta_title", stream: "http://example.com"}

代码语言:javascript
复制
ngOnInit() {
    
    this.route.paramMap
    .switchMap((params: ParamMap) =>
      this.service.getRadioData(params.get('slug'))
    )
    .subscribe(
      (data)  => {
        this.radio$ = data;
        console.log("this.radio$ IS: ", this.radio$)
        // this.radio$ - is a readable Object
      }
    );   
  }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46560078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档