Angular 2 - 在iframe上注入自定义标头

时间:2017-05-03 14:34:58

标签: javascript angular typescript iframe typescript2.0

我在尝试将请求自定义标头(类似'AUTH-TOKEN':'SomeToken123')注入到Angular 4上时发疯了。

我需要向iframe页面传递一些必需的自定义标头参数。

任何人都可以帮助我吗?

foo.component.html

<iframe [hidden]="isLoading" class="full" #iframe [src]="secureSrc" (load)="onIframeLoad()" frameborder="0" ></iframe>

component.ts

@Component({
    selector: 'app-foo',
    templateUrl: './foo.component.html'
})

export class FooComponent implements OnInit {

    @ViewChild('iframe') iframe: ElementRef;
    public isLoading: Boolean;
    public secureSrc: SafeResourceUrl;

    constructor(
        private sanitizer: DomSanitizer,
        private renderer: Renderer2,
        private router: Router
    ) {  }

    public ngOnInit() {
        this.isLoading = true;

        this.secureSrc = this.getIframeURL();
    }

    private getIframeURL(): SafeResourceUrl {
        return this.sanitizer
            .bypassSecurityTrustResourceUrl('https://iframe.address');
    }

    public onIframeLoad(): void {
        if (typeof this.iframe !== 'undefined') {

            // Once iFrame Loaded
            if (typeof this.token !== 'undefined') {
                this.iframe
                    .nativeElement
                    .contentWindow
                    .postMessage({
                        externalCommand: 'some-action',
                        parameter : 'action parameter'
                    }, '*');
            }

            this.isLoading = false;
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:6)

你可以这样做:

  1. 创建一个服务,该服务将发送http get请求以及标头,    并期待blob响应。
  2. 在您的组件中使用该服务来设置iframe的src。
  3. 删除[src] =&#34; secureSrc&#34;来自iframe,只留下#iframe
  4. // service
    import { Injectable } from '@angular/core';
    import { ResponseContentType, Http, RequestOptions, Headers } from '@angular/http';
    import { Observable } from 'rxjs/Observable';
    import { Subscriber } from 'rxjs/Subscriber';
    
    @Injectable()
    export class UrlHelperService {
        constructor(private http: Http) {
        }
    
        get(url: string): Observable<any> {
            let options = new RequestOptions();
            options.headers = new Headers();
            options.headers.append('AUTH-TOKEN', 'SomeToken123');
            options.responseType = ResponseContentType.Blob;
    
            return new Observable((observer: Subscriber<any>) => {
                let objectUrl: string = null;
    
                this.http
                    .get(url, options)
                    .subscribe(m => {
                        objectUrl = URL.createObjectURL(m.blob());
                        observer.next(objectUrl);
                    });
    
                return () => {
                    if (objectUrl) {
                        URL.revokeObjectURL(objectUrl);
                        objectUrl = null;
                    }
                };
            });
        }
    }
    
    // component
    import { Component, ViewChild, OnInit, ElementRef } from '@angular/core';
    import { UrlHelperService } from './url-helper.service';  
    
    @Component({
      selector: '',
      templateUrl: './my-app.component.html'
    })   
    export class MyAppComponent implements OnInit {
      @ViewChild('iframe') iframe: ElementRef;
    
      constructor(private urlHelperService: UrlHelperService) { }
    
      ngOnInit() {
        this.urlHelperService.get('http://localhost/api/file/123')
          .subscribe(blob => this.iframe.nativeElement.src = blob);
      }
    }