Angularv4.初体验


1370 浏览 5 years, 10 months

10 管道 Pipes & Custom Pipes

版权声明: 转载请注明出处 http://www.codingsoho.com/

10 -- Pipes & Custom Pipes

前面我们通过函数对网站进行了转换,改函数适用了当前component,如果我们想在所有的app里使用这个函数呢?可以用pipe,这个跟django的filter非常像。

先学习一个预定义的pipe (date)

可以在video-list.component.ts定义一个变量todayDate

  ngOnInit() {
    this.todayDate = new Date()
  }

然后在video-list.component.html里显示它

{{todayDate | date: "MM/dd/yy"}}

也有其他的参数,比如short

参考 https://angular.io/guide/pipes

接下来我们实现自己的pipe

在app下面创建目录utility

在根目录下面(app上一级目录)运行命令

ng g pipe safe

它在app下面创建两个文件

safe.pipe.spec.ts
safe.pipe.ts

同时在app.module.ts下面添加了这个pipe

import { SafePipe } from './safe.pipe';

@NgModule({
  declarations: [
    AppComponent,
    VideoListComponent,
    VideoDetailComponent,
    SafePipe
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
  ],
  providers: [],
  bootstrap: [AppComponent]
})

我们希望的是这个文件在utility目录下面,所以把它们移过去

接下来将getEmbedUrl的相关功能移到safe.pipe.ts里

import { DomSanitizer } from '@angular/platform-browser'

@Pipe({
  name: 'safe'
})
export class SafePipe implements PipeTransform {

  constructor(private sanitizer: DomSanitizer) { }

  transform(value: any, args?: any): any {
    if(value){
      return this.sanitizer.bypassSecurityTrustResourceUrl(value)
    }
  }
}

这样getEmbedUrl可以直接返回未处理链接地址

  getEmbedUrl(item){
    return '[http://player.youku.com/embed/](http://player.youku.com/embed/)' + item.embed + '=='
  }

同时在video-list.component.html添加pip

<iframe [src]='getEmbedUrl(item)|safe' width='480' height='400' frameborder=0 allowFullScreen='true'></iframe>