AngularJS 错误:策略不允许阻止从 url 加载资源$sceDelegate



我目前正在学习AngularJS的教程。这是我的控制器.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(...).成功不是一种功能

我完全不确定是什么导致了这些错误,我对 Angular 很陌生。我看到的我和其他示例之间唯一可能的区别是,在这个代码块中:(服务.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 拒绝在没有这两行的情况下运行应用程序,所以我认为这不是问题所在。

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

问题 #1

您尝试从应用请求的网址不安全 根据 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/**'
  ]);

对于清晰的解释和上面的示例来自这里

问题#2:

错误TypeError: ergastAPIservice.getDrivers(...).success is not a function的问题可能是由于您使用的AngularJS版本造成的。遗留.success/.error方法现在在最新的 AngularJs 版本 1.6 中被弃用。这是弃用通知 如果您使用的是最新的 AngularJs,这可能是原因,否则,我们需要更多信息来调试问题。

您可以使用

以下内容

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

最新更新