如何在AngularJS中设置一个variables的iframe src属性
我试图设置一个variables的iframe的src
属性,我不能得到它的工作…
标记:
<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>
控制器/ 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 ); } }
有了这个代码,没有任何东西被插入到iframe的src
属性中。 这只是空白。
更新1:我注入$sce
依赖到AppCtrl和$ sce.trustUrl()现在工作,而不会引发错误。 但是,它返回TrustedValueHolderType
,我不知道如何使用插入一个实际的URL。 无论我在属性src="{{trustUrl(currentProjectUrl))}}"
的插值大括号中使用$ sce.trustUrl(),还是在设置currentProjectUrl的值时在控制器内执行相同的types。 我甚至用这两种方法试了一下。
更新2:我想出了如何使用.toString()从trustedUrlHolder返回url,但是当我这样做的时候,当我尝试将它传递给src属性时,会引发安全警告。
更新3:如果在控制器中使用trustAsResourceUrl()并将其传递给ng-src属性中使用的variables,
$scope.setProject = function (id) { $scope.currentProject = $scope.projects[id]; $scope.currentProjectUrl = $sce.trustAsResourceUrl($scope.currentProject.url); console.log( $scope.currentProject ); console.log( $scope.currentProjectUrl ); }
我的问题似乎由此解决,虽然我不太清楚为什么。
我怀疑看看从控制器中没有定义trustSrc(currentProject.url)
函数trustSrc
的摘录。
您需要在控制器中注入$sce
服务 ,并在其中inputtrustAsResourceUrl
url
。
在控制器中:
function AppCtrl($scope, $sce) { // ... $scope.setProject = function (id) { $scope.currentProject = $scope.projects[id]; $scope.currentProjectUrl = $sce.trustAsResourceUrl($scope.currentProject.url); } }
在模板中:
<iframe ng-src="{{currentProjectUrl}}"> <!--content--> </iframe>
它是阻止具有外部域的URL的$ sce服务,它是为AngularJS提供严格的上下文转义服务的服务,以防止诸如XSS,点击劫持等安全漏洞,在Angular 1.2中默认启用。
你可以完全禁用它,但不build议
angular.module('myAppWithSceDisabledmyApp', []) .config(function($sceProvider) { $sceProvider.enabled(false); });
欲了解更多信息https://docs.angularjs.org/api/ng/service/ $ sce
请删除对trustSrc
函数的调用, trustSrc
再次尝试。 {{trustSrc(currentProject.url)}}到{{currentProject.url}}。 检查这个链接http://plnkr.co/edit/caqS1jE9fpmMn5NofUve?p=preview
但根据Angular Js 1.2 Documentation,你应该写一个获取src
url的函数。 看看下面的代码。
之前:
使用Javascript
scope.baseUrl = 'page'; scope.a = 1; scope.b = 2;
HTML
<!-- Are a and b properly escaped here? Is baseUrl controlled by user? --> <iframe src="{{baseUrl}}?a={{a}&b={{b}}"
但出于安全原因,他们正在推荐以下方法
使用Javascript
var baseUrl = "page"; scope.getIframeSrc = function() { // One should think about their particular case and sanitize accordingly var qs = ["a", "b"].map(function(value, name) { return encodeURIComponent(name) + "=" + encodeURIComponent(value); }).join("&"); // `baseUrl` isn't exposed to a user's control, so we don't have to worry about escaping it. return baseUrl + "?" + qs; };
HTML
<iframe src="{{getIframeSrc()}}">
select模板; iframe控制器,ng模型更新
的index.html
angularapp.controller('FieldCtrl', function ($scope, $sce) { var iframeclass = ''; $scope.loadTemplate = function() { if ($scope.template.length > 0) { // add iframe classs iframeclass = $scope.template.split('.')[0]; iframe.classList.add(iframeclass); $scope.activeTemplate = $sce.trustAsResourceUrl($scope.template); } else { iframe.classList.remove(iframeclass); }; }; }); // custom directive angularapp.directive('myChange', function() { return function(scope, element) { element.bind('input', function() { // the iframe function iframe.contentWindow.update({ name: element[0].name, value: element[0].value }); }); }; });
Iframe.html的
window.update = function(data) { $scope.$apply(function() { $scope[data.name] = (data.value.length > 0) ? data.value: defaults[data.name]; }); };
检查这个链接: http : //plnkr.co/edit/TGRj2o?p=preview