Estoy tratando de establecer el src
atributo de un iframe a partir de una variable y no puedo hacer que funcione ...
El marcado:
<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 );
}
}
Con este código, nada se inserta en el src
atributo del iframe . Es solo en blanco.
Actualización 1:$sce
inyecté
la dependencia en AppCtrl y $ sce.trustUrl () ahora funciona sin generar errores. Sin embargo, devuelve lo TrustedValueHolderType
que no estoy seguro de cómo usar para insertar una URL real. Se devuelve el mismo tipo si uso $ sce.trustUrl () dentro de las llaves de interpolación en el atributo src="{{trustUrl(currentProjectUrl))}}"
o si lo hago dentro del controlador al establecer el valor de currentProjectUrl. Incluso lo probé con ambos.
Actualización 2: descubrí cómo devolver la url del TrustedUrlHolder usando .toString () pero cuando hago eso, arroja la advertencia de seguridad cuando intento pasarla al atributo src.
Actualización 3: Funciona si uso trustAsResourceUrl () en el controlador y lo paso a una variable utilizada dentro del atributo 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 );
}
Esto parece resolver mi problema, aunque no estoy muy seguro de por qué.
fuente
trustAsResourceUrl
.trustAsResourceUrl
devuelve una$sce.RESOURCE_URL
que es necesaria paraiframe
/objects
whiletrustAsUrl
devuelve una$sce.URL
que es una garantía más débil (y actualmente no se utiliza según la documentación ).Es el
$sce
servicio que bloquea las URL con dominios externos, es un servicio que proporciona servicios estrictos de escape contextual a AngularJS, para evitar vulnerabilidades de seguridad como XSS, clickjacking, etc. Está habilitado de forma predeterminada en Angular 1.2.Puede deshabilitarlo por completo, pero no se recomienda
para más información https://docs.angularjs.org/api/ng/service/$sce
fuente
de esta manera sigo y me funciona bien, que funcione para ti,
aquí trustThisUrl es solo filtro,
fuente
Elimine la llamada a la
trustSrc
función e intente nuevamente de esta manera. {{trustSrc (currentProject.url)}} a {{currentProject.url}}. Consulte este enlace http://plnkr.co/edit/caqS1jE9fpmMn5NofUve?p=previewPero de acuerdo con la documentación de Angular Js 1.2, debe escribir una función para obtener la
src
URL. Echa un vistazo al siguiente código.Antes de:
Javascript
HTML
Pero por razones de seguridad, recomiendan el siguiente método
Javascript
HTML
fuente
ng-src
osrc
. Angular 1.2 en adelante, uno puede unirse a una sola expresión ensrc
yng-src
, y el consejo es para recuperar una URL a partir del código utilizando una función, si es necesario.seleccionar plantilla; controlador de iframe, actualización de modelo ng
index.html
iframe.html
Consulte este enlace: http://plnkr.co/edit/TGRj2o?p=preview
fuente
También necesita
$sce.trustAsResourceUrl
o no abrirá el sitio web dentro del iframe:fuente