优雅地处理AngularJS错误:$ injector:nomod模块不可用

Paw*_*lik 7 google-analytics adblock angularjs

我的角度应用取决于第三方角度服务:

var app = angular.module("ninjaModule", ['angular-google-analytics']);
Run Code Online (Sandbox Code Playgroud)

只要我的广告拦截插件关闭,该应用就可以正常加载.但是,如果广告拦截器出现角度$injector:nomod错误,则无法加载整个应用.

我正在寻找一种优雅地处理这些错误的方法,因此无论广告拦截器如何,都能够加载应用程序.如果angular-google-analytics不存在 - 那很好,它并不重要,我可以处理它或设置一些后备.但整个应用程序崩溃的情况对我来说不是一个选择.有任何想法吗?

确切地说 - 我不想解决广告拦截器问题,例如重命名我的脚本文件.我期待一个有角度的尝试捕捉魔法技巧.

Plunker:http://plnkr.co/edit/sbEG6vclPidPSNGV5Bsa

Paw*_*lik 4

我终于让它工作了。不过,该解决方案需要一些技巧:

  1. 检查 Angular-Google-Analytics 是否已加载
  2. deps动态为主模块准备依赖项列表 ( )
  3. 使用$injector而不是Analytics显式地使用

尽管如此,我仍然需要配置AnalyticsProvider,但它应该相对容易完成$injector


var deps = [];

try {
  angular.module("angular-google-analytics"); // this throws if GA script is not loaded
  deps.push('angular-google-analytics');
} catch(e){ console.error("GA not available", e); }

angular.module('mainApp', deps)
.run(function($rootScope, $injector) {
  try {
    Analytics = $injector.get('Analytics');
    $rootScope.trackPage = function() {
      console.log('Analytics in action!');
      Analytics.trackPage();
    }
  } catch(e) {
    $rootScope.trackPage = function(key, label) {
      console.log("Fallback in action!")
    }
  }
})
.controller('MyCtrl', function($rootScope, $scope) {
  $scope.message = 'Hello World!';
  $rootScope.trackPage();
});
Run Code Online (Sandbox Code Playgroud)

更新后的插件:http://plnkr.co/edit/Zo4RgKOybzhvJQdW2nQZ ?p=preview