J'essaie de définir l' src
attribut d'un iframe à partir d'une variable et je ne peux pas le faire fonctionner ...
Le balisage:
<div class="col-xs-12" ng-controller="AppCtrl">
<ul class="">
<li ng-repeat="project in projects">
<a ng-click="setProject(project.id)" href="">{{project.url}}</a>
</li>
</ul>
<iframe ng-src="{{trustSrc(currentProject.url)}}">
Something wrong...
</iframe>
</div>
controllers / app.js:
function AppCtrl ($scope) {
$scope.projects = {
1 : {
"id" : 1,
"name" : "Mela Sarkar",
"url" : "http://blabla.com",
"description" : "A professional portfolio site for McGill University professor Mela Sarkar."
},
2 : {
"id" : 2,
"name" : "Good Watching",
"url" : "http://goodwatching.com",
"description" : "Weekend experiment to help my mom decide what to watch."
}
};
$scope.setProject = function (id) {
$scope.currentProject = $scope.projects[id];
console.log( $scope.currentProject );
}
}
Avec ce code, rien n'est inséré dans l' src
attribut iframe . C'est juste vide.
Mise à jour 1:
j'ai injecté la $sce
dépendance dans AppCtrl et $ sce.trustUrl () fonctionne maintenant sans lancer d'erreurs. Cependant, il retourne TrustedValueHolderType
que je ne sais pas comment utiliser pour insérer une URL réelle. Le même type est renvoyé si j'utilise $ sce.trustUrl () à l'intérieur des accolades d'interpolation dans l'attribut src="{{trustUrl(currentProjectUrl))}}"
ou si je le fais à l'intérieur du contrôleur lors de la définition de la valeur de currentProjectUrl. Je l'ai même essayé avec les deux.
Mise à jour 2: j'ai compris comment renvoyer l'URL du trustedUrlHolder à l'aide de .toString () mais quand je le fais, il lance l'avertissement de sécurité lorsque j'essaie de le passer dans l'attribut src.
Mise à jour 3: cela fonctionne si j'utilise trustAsResourceUrl () dans le contrôleur et le transmets à une variable utilisée dans l'attribut ng-src:
$scope.setProject = function (id) {
$scope.currentProject = $scope.projects[id];
$scope.currentProjectUrl = $sce.trustAsResourceUrl($scope.currentProject.url);
console.log( $scope.currentProject );
console.log( $scope.currentProjectUrl );
}
Mon problème semble être résolu par cela, même si je ne sais pas trop pourquoi.
la source
trustAsResourceUrl
.trustAsResourceUrl
retourne un$sce.RESOURCE_URL
qui est nécessaire pouriframe
/objects
tandis quetrustAsUrl
renvoie un$sce.URL
qui est une sorte de garantie plus faible (et qui n'est actuellement pas utilisé selon la documentation ).C'est le
$sce
service qui bloque les URL avec des domaines externes, c'est un service qui fournit des services d'échappement contextuel strict à AngularJS, pour prévenir les failles de sécurité telles que XSS, le détournement de clics, etc. il est activé par défaut dans Angular 1.2.Vous pouvez le désactiver complètement, mais ce n'est pas recommandé
pour plus d'informations https://docs.angularjs.org/api/ng/service/$sce
la source
de cette façon, je suis et son travail pour moi très bien, que cela fonctionne pour vous,
ici trustThisUrl est juste un filtre,
la source
Veuillez supprimer l'appel à la
trustSrc
fonction et réessayer comme ceci. {{trustSrc (currentProject.url)}} à {{currentProject.url}}. Vérifiez ce lien http://plnkr.co/edit/caqS1jE9fpmMn5NofUve?p=previewMais selon la documentation Angular Js 1.2, vous devez écrire une fonction pour obtenir l'
src
url. Jetez un oeil sur le code suivant.Avant:
Javascript
Html
Mais pour des raisons de sécurité, ils recommandent la méthode suivante
Javascript
Html
la source
ng-src
ousrc
. Angular 1.2 en avant, on peut se lier à une seule expression danssrc
etng-src
et le conseil est de récupérer une URL du code en utilisant une fonction, si nécessaire.sélectionner un modèle; contrôleur iframe, mise à jour du modèle ng
index.html
iframe.html
Vérifiez ce lien: http://plnkr.co/edit/TGRj2o?p=preview
la source
Vous devez également
$sce.trustAsResourceUrl
ou il n'ouvrira pas le site Web à l'intérieur de l'iframe:la source