【问题标题】:AngularJS ng-src inside of iframeiframe 中的 AngularJS ng-src
【发布时间】:2020-03-07 03:21:07
【问题描述】:

我在 iframe 中使用 ng-src 时遇到问题。我需要这样做:

<div class="tab-content">
        <ul class="nav nav-tabs" ng-repeat="document in issues.Document">
            <div class="tab-pane pdf-height col-md-5 padding_0" id="{{document.name}}">
                <iframe ng-src="http://192.168.223.110/cat/{{document.directory}}/{{document.name}}.{{document.type}}" height="100%" width="100%"></iframe>                    
            </div>
        </ul>
    </div>

结果:

<iframe ng-src="http://192.168.223.110/cat/{{document.directory}}/{{document.name}}.{{document.type}}" height="100%" width="100%" src="http://192.168.223.110/cat/{{document.directory}}/{{document.name}}.{{document.type}}"></iframe>

我知道问题出在 $sce 上,这是针对 XSS 的保护,并且需要将链接添加到白名单中......所以当我这样做时它正在工作。

<ul class="nav nav-tabs" ng-repeat="document in issues.Document">
    <div class="tab-pane pdf-height col-md-5 padding_0" id="{{document.name}}">
         <iframe ng-src="{{someUrl}}" height="100%" width="100%"></iframe>                    
     </div>
</ul>

我在控制器内部定义:

$rootScope.someUrl = $sce.trustAsResourceUrl('http://192.168.223.110/cat/files/incoming/12345_3232ASD_pero.pdf');

但我不能那样做,因为我正在循环使用 ng-repeat,所以链接是动态生成的。它需要从数据库中读取!

【问题讨论】:

    标签: javascript angularjs iframe


    【解决方案1】:

    您可以改用过滤器:

    HTML:

    <iframe src="{{yourURL | trustAsResourceUrl}}"></iframe>
    

    其中 'yourURL' 是 iframe 的 URL,而 'trustAsResourceUrl' 是过滤器,在某些模块(如过滤器模块)中定义为:

    JS:

    angular.module('filters-module', [])
    .filter('trustAsResourceUrl', ['$sce', function($sce) {
        return function(val) {
            return $sce.trustAsResourceUrl(val);
        };
    }])
    

    您可以在应用程序中的所有 iframe 和其他嵌入项目中使用此过滤器。 此过滤器将处理您只需添加过滤器即可信任的所有网址。

    【讨论】:

    • 好的,如果我只有一个,那会起作用..但它在 ng-repeat 内部不起作用:/ {{apiUrl}}{{document.directory}}/{{document.name }}.{{document.type}} 我正在创建这样的链接..
    • 你能为此创建一个小提琴吗?或者提供一个代码sn-p。我不明白为什么这不起作用。
    • 哦,对不起,您可能没有看到我的答案 :) 问题是我没有以正确的方式编写 url.. :) 过滤器工作正常,谢谢! :)
    • 我认为对于 iframe 用户 ng-src 更好,'src' 在加载 angular 之前向服务器发送一些错误请求。
    • 是的,同意。它基本上尝试使用花括号表达式检索 iframe,该表达式被编码为一些丑陋的 url :)
    【解决方案2】:

    好的,我发现了问题所在.. 感谢您的过滤器现在正在工作:)

    我需要做的就是创建 ng-src 链接:

    <iframe ng-src="{{apiUrl+document.directory + '/' + document.name + '.'+ document.type   | trustAsResourceUrl}}"
            height="100%" width="100%">
    </iframe>
    

    也许这对某人有帮助! :)

    【讨论】:

      【解决方案3】:

      正如 Kop4lyf 所说 你需要在js中添加过滤器

      //Create a filter for trust url
          app.filter('trustAsResourceUrl', ['$sce', function($sce) {
          return function(val) {
              return $sce.trustAsResourceUrl(val);
          };
      }]);
      

      并将 ih html 输出为

      ng-src="{{x.title.rendered | trustAsResourceUrl}}"
      

      其他一些过滤器:

      //Create a filter for trust html
          app.filter('trustAsHtml', ['$sce', function($sce) {
          return function(val) {
              return $sce.trustAsHtml(val);
          };
      }]);
      

      【讨论】:

        猜你喜欢
        • 2015-07-27
        • 2014-08-30
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多