2017-04-23 103 views
1

無法理解爲什麼數據不綁定在ui上,嘗試使用* ngFor綁定數組,但在數組存在於數組中時不顯示任何數據。這裏組件代碼:數據綁定不工作角2

import { Component, Injector, OnInit, OnDestroy, Pipe } from '@angular/core' 
import { AdvancedPostsService } from '../../services/advanced.posts.service' 
import { SpinnerService } from '../../services/spinner.service' 
import { PathKey } from '../../helpers/platform.helpers' 
import { Router } from '@angular/router' 
import { ToolsService } from '../../services/tools.service' 
import { YoutubeToolsService } from '../../services/youtube.tools.service' 

@Pipe({ name: 'safe' }) 
@Component({ 
    selector: 'advanced-post-youtube-step-component', 
    templateUrl: '../../templates/advanced-posts-templates/advanced.post.youtube.component.html' 
}) 
export class AdvancedPostYoutubeStep implements OnInit, OnDestroy { 

    private postId: number; 
    private stepId: number; 
    private postType: number; 
    videoList: any[] = []; 
    private youTubeWatchUrl = "https://www.youtube.com/embed/"; 
    i = 0; 

    constructor(private advancedPostsService: AdvancedPostsService, 
     private spinner: SpinnerService, 
     private toolsService: ToolsService, 
     private injector: Injector, 
     private router: Router, 
     private youtubeToolsService: YoutubeToolsService) { 
     this.injectParentData(); 
    } 

    ngOnInit(): void { 
     this.youtubeToolsService.change.on(this.onYoutubeVideosLoaded.bind(this)); 
     this.youtubeToolsService.initGoogleAuthentication(); 
     this.spinner.stop(); 
    } 

    onYoutubeVideosLoaded(self: YoutubeToolsService) { 
     for (let item of self.videoList) { 
      if (item) { 
       console.log(item); 
       this.videoList.push({ 
        id: item.snippet.resourceId.videoId, 
        url: this.youTubeWatchUrl + item.snippet.resourceId.videoId 
       }); 
      } 
     } 
     console.log(this.videoList); 
    } 

    ngOnDestroy(): void { 
     this.youtubeToolsService.change.off(this.onYoutubeVideosLoaded.bind(this)); 
     this.spinner.start(); 
    } 

    injectParentData() { 
     this.postId = this.injector.get(PathKey.PostId); 
     this.stepId = this.injector.get(PathKey.StepId); 
     this.postType = this.injector.get(PathKey.PostType); 

    } 
} 

和UI部分:

<div class="col-md-6 col-md-offset-3"> 
    <h3 class="text-center">Select video</h3> 

    <div> 
     <iframe *ngFor="let video of videoList" type="text/html" class="video-responsive" [src]="video?.url | safe" frameborder="0"></iframe> 
    </div> 
    <h4>{{videoList.length}}</h4> 
</div> 

即使videoList.lenth不顯示。任何人都知道這裏有什麼問題?

UPDATE YoutubeToolsService代碼:

import { NgZone, Injectable} from '@angular/core' 
import { OperationDataResult } from '../helpers/operation.models' 
import { Config } from '../helpers/social.models' 
import { LiteEvent } from '../helpers/lite.event' 
import { SocialService } from '../services/social.service' 


declare var gapi: any; 

@Injectable() 
export class YoutubeToolsService { 

    private loginStatus: any; 
    private onChange = new LiteEvent<YoutubeToolsService>(); 
    get change() { return this.onChange.expose(); } 
    videoList: any[] = []; 

    requestVideoPlaylist(playlistId) { 
     var requestOptions = { 
      playlistId: playlistId, 
      part: 'snippet', 
      maxResults: 10 
     }; 

     var request = gapi.client.youtube.playlistItems.list(requestOptions); 
     request.execute(response => { 
      var playlistItems = response.result.items; 
      if (playlistItems) { 

       this.videoList = playlistItems; 
       this.onChange.trigger(this); 
      } 
     }); 
    } 
+1

你能告訴我們'youtubeToolsService'更改'on'&'off'方法代碼嗎? –

+0

@PankajParkar肯定,更新 – Vitaliy

回答

2

基本上要更新視圖從外部角上下文結合可變。在這種情況下,zonejs不理解綁定得到更新,並且無法執行更改檢測。這就是爲什麼在這種情況下,您必須運行變更檢測功能,循環使用onYoutubeVideosLoaded函數。同樣,您可以使用ChangeDetectorRef API &調用detectChanges方法,只要您想運行更改檢測以手動更新綁定。

constructor(private ref: ChangeDetectorRef) { }; //inject & import ChangeDetectorRef 
//OR 
//constructor(private _ngZone: NgZone) { }; //make sure constructor have NgZone 

onYoutubeVideosLoaded(self: YoutubeToolsService) { 
    //below commented that can be alternative way of doing it 
    //this._ngZone.run(() => { 
     for (let item of self.videoList) { 
     if (item) { 
      console.log(item); 
      this.videoList.push({ 
       id: item.snippet.resourceId.videoId, 
       url: this.youTubeWatchUrl + item.snippet.resourceId.videoId 
      }); 
     } 
     } 
     //running CD manually 
     this.ref.detectChanges(); 
    //}); 
} 
+0

這是我的解決方案,通過使用ChangeDetectorRef,謝謝! :) – Vitaliy

+1

@Vitaliy太棒了!很高興幫助你,謝謝:) –