【问题标题】:AngularJS errors: Blocked loading resource from url not allowed by $sceDelegate policyAngularJS 错误:$sceDelegate 策略不允许从 url 加载资源
【发布时间】:2019-02-19 15:35:19
【问题描述】:

我目前正在学习 AngularJS 的教程。这是我的 controllers.js 文件中的代码。

'use strict';

angular.module ( 'F1FeederApp.controllers' , []                                     )
.controller    ( 'driversController'       , function ( $scope , ergastAPIservice ) {

    $scope.nameFilter = null;
    $scope.driversList = [];

    ergastAPIservice.getDrivers ().success ( function ( response ) {
        $scope.driversList = response.MRData.StandingsTable.StandingsLists [ 0 ].DriverStandings;
    });
});

我收到以下错误:

1) $sceDelegate 策略不允许从 url 加载资源。

2) TypeError: ergastAPIservice.getDrivers(...).success 不是函数

我完全不确定是什么导致了这些错误,我对 Angular 很陌生。我在我的示例和其他示例之间看到的唯一可能的区别是在这段代码中:( services.js )

'use strict';

angular.module ( 'F1FeederApp.services' , []                 )
.factory       ( 'ergastAPIservice'     , function ( $http ) {

    var ergastAPI = {};

    ergastAPI.getDrivers = function () {
        return $http ({
            method : 'JSONP' ,
            url    : 'http://ergast.com/api/f1/2013/driverStandings.json?callback=JSON_CALLBACK'
        });
    };

    return ergastAPI;
});

我注意到的不同之处在于,在我的 getDrivers 函数末尾有一个分号,并且我在文件顶部也有 use strict 语句。但是,grunt 拒绝在没有这两行的情况下运行应用程序,所以我认为这不是问题。

如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: javascript angularjs angularjs-1.6


    【解决方案1】:

    问题 #1

    您尝试从您的应用请求的 url 不安全 根据 AngularJS sceDelegatePolicy。要解决它,您需要 使用resourceUrlWhitelist 方法将应用中的网址列入白名单 在$sceDelegateProvider如下图:

    angular.module('myApp', []).config(function($sceDelegateProvider) {  
    $sceDelegateProvider.resourceUrlWhitelist([
        // Allow same origin resource loads.
        'self',
        // Allow loading from our assets domain. **.
        'http://ergast.com/**'
      ]);
    

    为了解释清楚,上面的例子来自here

    问题 #2:

    错误TypeError: ergastAPIservice.getDrivers(...).success is not a function 的问题可能与您使用的AngularJS 版本有关。旧的 .success/.error 方法现在在最新的 AngularJs 版本 1.6 中被弃用了。这是 Deprecation notice 如果您使用的是最新的 AngularJs,这可能是原因,否则,我们需要更多信息来调试问题。

    【讨论】:

      【解决方案2】:

      你可以使用以下

      $scope.trustSrc = function(src) {
          return $sce.trustAsResourceUrl(src);
      }
      
      and your html should have {{trustSrc(myUrl)}} instead of {{myUrl}}
      

      【讨论】:

      • $sce 是在哪里定义的,它的引用是什么?
      • @lance.dolan 这是一个docs.angularjs.org/api/ng/service/$sce - 在创建控制器时将其添加到 function() 参数以及分配给 controller.$inject 的数组中
      猜你喜欢
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2019-11-08
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多