Cuando trabajamos con Angular e intentamos agregar una url externa de manera dinámica nos encontramos con que el link no funciona y, si miramos nuestra consola, nos muestra el siguiente error: «unsafe value used in a resource URL context«. Esto se debe a que, al venir la url desde una variable, Angular nos obliga a validarla para asegurarnos que sea un link seguro.

En los siguientes pasos presentaremos una manera elegante de resolverlo utilizando un pipe al cual le vamos a poder pasar una url completa o en 2 partes. Esta ultima opción nos será útil al trabajar con aplicaciones que nos envían solo un segmento del link.

Creando el pipe:

Podemos crear nuestro pipe de dos maneras: desde consola con el comando ng g p «ruta+nombre»  o creando el archivo a mano.

Para el ejemplo nombraremos a nuestro archivo «safeurl.pipe.ts».

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({
  name: 'safeUrl'
})
export class safeUrlPipe implements PipeTransform {

  constructor ( private _domSanitizer:DomSanitizer){}

  transform(value: string; url:string = ''): any {

    return this._domSanitizer.bypassSecurityTrustResourceUrl( url + value );

  }

}




Si utilizamos la linea de comandos de angular-cli seguramente haya quedado todo listo para ser utilizado y podemos saltarnos el siguiente paso. Si lo hicimos a mano, o por algún motivo no se configuró correctamente, tenemos que agregar en app.module nuestro pipe importándolo y sumándolo a las declaraciones:

/* Por buena práctica pusimos nuestro archivo en app/pipes */

import { safeUrlPipe } from './pipes/safeurl.pipe';


@NgModule({
  declarations: [
    .....
    safeUrlPipe,
    .....
  ],
  ....
})
...

 

Utilizando nuestro pipe:

Presentamos 2 ejemplos para que podamos ver como trabaja con una url completa y una segmentada.

/* Ejemplo con una url completa */
<iframe width="640" height="360" [src]="urlVideo | safeUrl" frameborder="0" allowfullscreen></iframe>

/* Ejemplo con una url segmentada */
<iframe [src]="pista.uri | safeUrl:'https://open.spotify.com/embed?uri='" width="300" height="80" frameborder="0" allowtransparency="true"></iframe>