2017-03-13 13 views
-1

私はURLから来るIDを取得するコンストラクタを持っています。それから私はngInitでこれを持っている:angular2はobservable subscribe内のオブジェクトを設定できません

ngOnInit() { 
this.as.getPostById(this.postId).subscribe(
    (post) => { 
    this.thepost = post; 
    console.log(this.thepost); 
    this.meta['title'] = 'title of the post'; 
    this.meta['metaTitle'] = 'meta tag title'; 
    this.meta['metaDesc'] = 'dynamic description for post'; 
    this.meta['metaKeywords'] = 'dynamic,keywords,post'; 
    this.meta['ogTitle'] = 'post title'; 
    this.meta['ogDesc'] = 'dynamic description to share post'; 
    this.meta['ogImg'] = '/assets/images/postimage.jpg'; 
    this.meta['ogUrl'] = '/post/idpost'; 
    } 
); 
//console.log(this.thepost); 
// this.meta['title'] = 'title of the post'; 
// this.meta['metaTitle'] = 'meta tag title'; 
// this.meta['metaDesc'] = 'dynamic description for post'; 
// this.meta['metaKeywords'] = 'dynamic,keywords,post'; 
// this.meta['ogTitle'] = 'post title'; 
// this.meta['ogDesc'] = 'dynamic description to share post'; 
// this.meta['ogImg'] = '/assets/images/postimage.jpg'; 
// this.meta['ogUrl'] = '/post/idpost'; 
} 

私はそれが動作しない購読内部メタオブジェクトを設定している場合。メタタグの外側は変化します。これはこれで終わりです。私はサブスクリプション内でそれを設定し、私はテンプレートでそれを使用することができますが、私がサブスクリプションの外にログオンすると、それは未定義です。

ここでは何が欠けていますか?

は私が現時点で私が持っている全体のコードを追加してみましょう。

import { Component, OnInit,OnDestroy,AfterViewInit,Renderer } from  '@angular/core'; 
import { Router, ActivatedRoute } from '@angular/router'; 
import { Subscription } from 'rxjs/RX'; 
import {AppService} from '../services/app.service'; 
import { MetaSetterService } from '../services/meta-setter.service'; 

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

    subscription: Subscription; 
    postId:String; 
    thepost; 
    meta:Object = {}; 
    post; 
    postTitle:String; 

    constructor(
    private router: Router, 
    private activeR: ActivatedRoute, 
    private as:AppService, 
    private metaSetter:MetaSetterService, 
    public renderer:Renderer 
) { 

    this.subscription = this.activeR.params.subscribe(
     (param:any) => { 
     this.postId = param['id']; 
     } 
    ) 
    } 

    ngOnInit() { 
    this.as.getPostById(this.postId).subscribe(
     (post) => { 
     this.thepost = post; 
     console.log(this.thepost); 
     this.postTitle = post.title; 
     this.meta['title'] = 'title of the post'; 
     this.meta['metaTitle'] = 'meta tag title'; 
     this.meta['metaDesc'] = 'dynamic description for post'; 
     this.meta['metaKeywords'] = 'dynamic,keywords,post'; 
     this.meta['ogTitle'] = 'post title'; 
     this.meta['ogDesc'] = 'dynamic description to share post'; 
     this.meta['ogImg'] = '/assets/images/postimage.jpg'; 
     this.meta['ogUrl'] = '/post/idpost'; 
     } 
    ); 
    //console.log(this.thepost); 
    // this.meta['title'] = 'title of the post'; 
    // this.meta['metaTitle'] = 'meta tag title'; 
    // this.meta['metaDesc'] = 'dynamic description for post'; 
    // this.meta['metaKeywords'] = 'dynamic,keywords,post'; 
    // this.meta['ogTitle'] = 'post title'; 
    // this.meta['ogDesc'] = 'dynamic description to share post'; 
    // this.meta['ogImg'] = '/assets/images/postimage.jpg'; 
    // this.meta['ogUrl'] = '/post/idpost'; 
    } 



    ngOnDestroy(){ 
    this.subscription.unsubscribe(); 
    } 

    ngAfterViewInit():void{ 
    this.metaSetter.setAll(this.renderer,this.meta); 
    } 


} 
+0

なぜあなたはそれが購読者の外で定義されることを期待しましたか?コールバックが呼び出されるまでは存在しません。そのため、コールバック*を書くのです。 – jonrsharpe

答えて

0

データはあなたのas.getPostById().subscribe()呼び出しから到着する前にコメントアウトされたコードが実行されます。これが非同期実行の性質です。

subscribe(...)コールバック内で応答に応じて移動するコードを移動する必要があります。

+1

重複を検索すると、この質問に多くの回答があったことを示しています。 – jonrsharpe

+0

重複を検索して検索を停止することが難しい質問があります。おそらく私は間違ったキーワードを検索しています... –

+1

私は* "角2購読ログの未定義のサイトを購読しました:stackoverflow.com" * Googleで、かなりの数が見つかりました! – jonrsharpe

関連する問題