【问题标题】:Load an URL inside an iFrame in AngularJS app在 AngularJS 应用程序的 iFrame 中加载 URL
【发布时间】:2015-04-18 11:13:43
【问题描述】:

我正在 iframe 内的 Angular 应用程序中加载 url。这是我的代码:

HTML:

<div layout="column" flex class="content-wrapper" id="primary-col">
       <md-content layout="column" flex class="md-padding">
              <h2>{{selected.name}}</h2>
              <p>{{selected.content}}</p>
              <div class="cell">
                <iframe ng-src="{{selected.imgurl}}"  >  
              </div>
      </md-content>
</div>

App.Js:

var routerApp =angular.module('DiginRt', ['ngMaterial'])
 routerApp.controller('AppCtrl', ['$scope', '$mdSidenav', 'muppetService', '$timeout','$log', function($scope, $mdSidenav, muppetService, $timeout, $log) {
  var allMuppets = [];

  $scope.selected = null;
  $scope.muppets = allMuppets;
  $scope.selectMuppet = selectMuppet;
  $scope.toggleSidenav = toggleSidenav;

  loadMuppets();

  //*******************
  // Internal Methods
  //*******************
  function loadMuppets() {
    muppetService.loadAll()
      .then(function(muppets){
        allMuppets = muppets;
        $scope.muppets = [].concat(muppets);
        $scope.selected = $scope.muppets[0];
      })
  }

  function toggleSidenav(name) {
    $mdSidenav(name).toggle();
  }

  function selectMuppet(muppet) {
    $scope.selected = angular.isNumber(muppet) ? $scope.muppets[muppet] : muppet;
    $scope.toggleSidenav('left');
  }
}])

    routerApp.service('muppetService', ['$q', function($q) {
      var muppets = [{
          name: 'Product Report',
          iconurl: 'https://lh3.googleusercontent.com/-KGsfSssKoEU/AAAAAAAAAAI/AAAAAAAAAC4/j_0iL_6y3dE/s96-c-k-no/photo.jpg',
          imgurl: 'https://my.infocaptor.com/dash/mt.php?pa=inflation_50da569f84101',
          content: ' '
      }, {
          name: 'Invoice Report',
          iconurl: 'https://yt3.ggpht.com/-cEjxni3_Jig/AAAAAAAAAAI/AAAAAAAAAAA/cMW2NEAUf-k/s88-c-k-no/photo.jpg',
          imgurl: 'https://my.infocaptor.com/dash/mt.php?pa=inflation_50da569f84101',
          content: ''
      } ];

      // Promise-based API
      return {
          loadAll: function() {
              // Simulate async nature of real remote calls
              return $q.when(muppets);
          }
      };
    }]);

它再次出现错误说 错误:[$interpolate:interr] 无法插值:{{selected.imgurl}} 错误:[$sce:insecurl] 阻止从 url 加载资源,$sceDelegate 策略不允许。

这里是Plunker

【问题讨论】:

  • 试试&lt;iframe ng-src="'{{selected.imgurl}}'" &gt; &lt;/iframe&gt;应该可以工作
  • @pankajparkar 以前我是这样的,它可以工作

标签: javascript angularjs iframe material-design


【解决方案1】:

您需要使用 $sce API 清理 URL,通过调用方法 trustAsResourceUrl 使该 URL 成为可信的。

方法

$scope.trustSrc = $sce.trustAsResourceUrl;

HTML

<iframe ng-src="{{trustSrc(selected.imgurl)}}"></iframe>

别忘了在你的控制器上添加 $sce 依赖。

Working Plunkr with you code

希望这可以帮助你。谢谢。

【讨论】:

  • @Sajeetharan 你检查过修改后的 plunkr 吗?
  • 是的,它有效。我的意思是,在你发布这个答案之前,我尝试了同样的方法
  • @ashish_pbh 很高兴听到这个消息.. 干杯:)
  • 如果您在一页上加载多个 iFrame,请谨慎使用 。由于角度加载变幻莫测,您的函数 trustSrc 可能被调用的次数比您意识到的导致内存泄漏的次数多得多。相反,我建议在加载数据时在指令或控制器中为对象本身设置一个 url 属性,然后直接使用该 url。这样你就可以确保你的代码每个项目只触发一次
  • 如果您确定selected.imgurl 没有改变,您可以使用:: 一次性绑定它。这将确保src 不会改变。 docs.angularjs.org/guide/expression
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2018-03-01
  • 2015-01-15
相关资源
最近更新 更多