Depuis la mise à niveau vers la dernière version candidate angulaire 2, mes balises img génèrent une erreur.
Le tag img:
<img class='photo-img' [hidden]="!showPhoto1" src='{{theMediaItem.photoURL1}}'>
Générer l'erreur de navigateur:
ORIGINAL EXCEPTION: Error: unsafe value used in a resource URL context
La valeur de l'URL est:
http://veeu-images.s3.amazonaws.com/media/userphotos/116_1464645173408_cdv_photo_007.jpg
MODIFIER:
J'ai essayé la suggestion faite dans l'autre solution que cette question est supposée être un doublon mais je reçois la même erreur.
J'ai ajouté le code suivant au contrôleur:
import {DomSanitizationService} from '@angular/platform-browser';
@Component({
templateUrl: 'build/pages/veeu/veeu.html'
})
export class VeeUPage {
static get parameters() {
return [[NavController], [App], [MenuController], [DomSanitizationService]];
}
constructor(nav, app, menu, sanitizer) {
this.app = app;
this.nav = nav;
this.menu = menu;
this.sanitizer = sanitizer;
this.theMediaItem.photoURL1 = this.sanitizer.bypassSecurityTrustUrl(this.mediaItems[1].url);
}
Je reçois toujours le même message d'erreur.
EDIT2:
J'ai aussi changé le HTML pour:
<img class='photo-img' [hidden]="!showPhoto1" [src]='theMediaItem.photoURL1'>
J'ai toujours le même message d'erreur
J'utilise rc.4 et cette méthode fonctionne pour ES2015 (ES6):
import {DomSanitizationService} from '@angular/platform-browser';
@Component({
templateUrl: 'build/pages/veeu/veeu.html'
})
export class VeeUPage {
static get parameters() {
return [NavController, App, MenuController, DomSanitizationService];
}
constructor(nav, app, menu, sanitizer) {
this.app = app;
this.nav = nav;
this.menu = menu;
this.sanitizer = sanitizer;
}
photoURL() {
return this.sanitizer.bypassSecurityTrustUrl(this.mediaItems[1].url);
}
}
Dans le HTML:
<iframe [src]='photoURL()' width="640" height="360" frameborder="0"
webkitallowfullscreen mozallowfullscreen allowfullscreen>
</iframe>
L'utilisation d'une fonction garantit que la valeur ne change pas après sa désinfection. Sachez également que la fonction de désinfection que vous utilisez dépend du contexte.
Pour les images, bypassSecurityTrustUrl
fonctionnera, mais pour d'autres utilisations, vous devez vous reporter à la documentation:
https://angular.io/docs/ts/latest/api/platform-browser/index/DomSanitizer-class.html
import { DomSanitizer } from '@angular/platform-browser';
...
constructor(public sanitizer: DomSanitizer){}
... alors dans le HTML:
<iframe [src]='sanitizer.bypassSecurityTrustResourceUrl(myurl)' width="640" height="360" frameborder="0"
webkitallowfullscreen mozallowfullscreen allowfullscreen>
</iframe>
Interface d'objet:
import { SafeUrl } from '@angular/platform-browser';
export class Book {
constructor(public title: string, public videoURL?: SafeUrl) {}
}
Service (à titre d'exemple):
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { Book } from '../features/models/book';
import { DomSanitizer } from '@angular/platform-browser';
@Injectable()
export class BookService {
constructor(
private sanitizer: DomSanitizer
) {}
getBooks (): Observable<Book[]> {
return new Observable( observer => {
observer.next(
new Book(
'Some Book Title',
this.sanitizer.bypassSecurityTrustResourceUrl(
'https://player.vimeo.com/video/12345678'
)
),
new Book(
'Second BookTitle',
this.sanitizer.bypassSecurityTrustResourceUrl(
'https://player.vimeo.com/video/91011121'
)
)
)
});
}
}
Le moyen le plus élégant de résoudre ce problème: utilisez un tuyau. Voici un exemple (mon blog). Ainsi, vous pouvez simplement utiliser url | safe
pipe pour contourner la sécurité.
<iframe [src]="url | safe"></iframe>
Vous pouvez exposer le désinfectant à la vue ou exposer une méthode qui transfère l'appel à bypassSecurityTrustUrl.
<img class='photo-img' [hidden]="!showPhoto1"
[src]='sanitizer.bypassSecurityTrustUrl(theMediaItem.photoURL1)'>
Utilisez Safe Pipe pour y remédier.
Créer un tuyau sûr si vous n'en avez pas.
ng g c pipe safe
ajouter un tuyau sécurisé dans app.module.ts
déclarations: [ SafePipe ]
déclarer un tuyau sûr dans vos ts
Importez le désinfectant Dom et le Safe Pipe pour accéder à l'URL en toute sécurité
import { Pipe, PipeTransform} from '@angular/core';
import { DomSanitizer } from "@angular/platform-browser";
@Pipe({ name: 'safe' })
export class SafePipe implements PipeTransform {
constructor(private sanitizer: DomSanitizer) { }
transform(url) {
return this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
}
- Ajouter un coffre-fort avec l'URL src
<iframe width="900" height="500" [src]="link | safe"/>
import {DomSanitizationService} from '@angular/platform-browser';
@Component({
templateUrl: 'build/pages/veeu/veeu.html'
})
export class VeeUPage {
trustedURL:any;
static get parameters() {
return [NavController, App, MenuController,
DomSanitizationService];
}
constructor(nav, app, menu, sanitizer) {
this.app = app;
this.nav = nav;
this.menu = menu;
this.sanitizer = sanitizer;
this.trustedURL = sanitizer.bypassSecurityTrustUrl(this.mediaItems[1].url);
}
}
<iframe [src]='trustedURL' width="640" height="360" frameborder="0"
webkitallowfullscreen mozallowfullscreen allowfullscreen>
</iframe>
User property binding instead of function.
J'ajoute généralement le composant réutilisable
safe pipe
séparé comme suit
# Add Safe Pipe
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Pipe({name: 'mySafe'})
export class SafePipe implements PipeTransform {
constructor(private sanitizer: DomSanitizer) {
}
public transform(url) {
return this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
}
# then create shared pipe module as following
import { NgModule } from '@angular/core';
import { SafePipe } from './safe.pipe';
@NgModule({
declarations: [
SafePipe
],
exports: [
SafePipe
]
})
export class SharedPipesModule {
}
# import shared pipe module in your native module
@NgModule({
declarations: [],
imports: [
SharedPipesModule,
],
})
export class SupportModule {
}
<!-------------------
call your url (`trustedUrl` for me) and add `mySafe` as defined in Safe Pipe
---------------->
<div class="container-fluid" *ngIf="trustedUrl">
<iframe [src]="trustedUrl | mySafe" align="middle" width="100%" height="800" frameborder="0"></iframe>
</div>