2015-08-21 55 views
1

我最近通過ng-app默認方法將我的項目從bootstrapping angular轉換爲使用RequireJs並手動執行。大部分時間一切都正常,但是有一部分時間出現錯誤,說我的控制器和登錄頁面的服務是未定義的,所以控制器沒有正確加載並且值沒有被綁定。RequireJs依賴項的角度執行順序

我認爲這個問題源於執行依賴關係的順序。首先,這裏有錯誤:

錯誤:[NG:AREQ] http://errors.angularjs.org/1.3.15/ng/areq?p0=NavController&p1=not%20aNaNunction%2C%20got%20undefined

錯誤:[$注射器:unpr] http://errors.angularjs.org/1.3.15/ $噴油器/ unpr P0 = UsersServiceProvider%20%3 C-%20UsersService%20% 3C-%20LoginController

到目前爲止,我只在Chrome中看到這個問題,並且當我有javascript控制檯打開時,一切似乎都奏效。我已經插入了一些console.log()語句來了解這些腳本中的活動順序。對於三個文件,routeConfig.js,nav.js和usersService.js我有一個console.log在定義函數的第一行,另一個在角定義函數的第一行:

routeConfig.js :

define(['angularAMD', 
     'angular-route', 
     'uiBootstrap', 
     'lib/angularSlideables', 
     'lib/ng-infinite-scroll', 
     'lib/angular-modal-service'], function (angularAMD) { 

    console.log('top of routeConfig'); 

    var app = angular.module('svlPlatform', ['ngRoute', 'ui.bootstrap', 'angularSlideables', 'infinite-scroll', 'angularModalService']).value('THROTTLE_MILLISECONDS', 750); 

    app.config(['$routeProvider', function ($routeProvider, $httpProvider) { 

     console.log('inside routeConfig'); 

     // Because angularAMD is built on requireJS, the following paths to controllerUrl follow requireJs's conventions. 
     // They don't need a .js extention and they are relative to the baseUrl specified in require.config. 
     $routeProvider 
      .when('/login', angularAMD.route({ 
       templateUrl: 'views/login.html', 
       controllerUrl: 'controllers/login' 
      })) 
      .when('/me', angularAMD.route({ 
       templateUrl: 'views/me.html', 
       controllerUrl: 'controllers/me' 
      })) //this continues and returns app... 

nav.js:

define(['config/routeConfig', 'services/authService', 'services/usersService', 'services/menuService'], function(app) { 

    console.log('top of nav controller'); 

    app.controller('NavController', ['$log', '$anchorScroll', '$location', '$rootScope', 'AuthService', 'UsersService', 'MenuService', 
     function ($log, $anchorScroll, $location, $rootScope, auth, users, menu) { 

     console.log('inside nav controller'); 

      var vm = this; 
      menuScope = this; 

      function loadMenu() { 
       menu.items().then(function(response){ 
        vm.menuItems = response.data.menuItems; 
        $('body').css("background-color","#f2f2f2"); 
        markMenuActive(vm.menuItems); 
       }, function(error) { 
        console.log('There was a problem getting the menu data.'); 
       }); 
      } //continues... 

usersService.js

define(['config/routeConfig', 'utils/urlBuilder', 'services/menuService'], function (app, _urlBuilder) { 

    console.log('top of users service'); 

    var urlBuilder = _urlBuilder; 
    app.factory('UsersService', ['$http', 'MenuService', function ($http, menu) { 

     console.log('inside users service'); 

     var meCache; 
     var refreshMeCache = function() { 
      meCache = $http.get('/api/v1/users/me'); 
      menu.refreshItemsCache(); 
     }; //continues... 

這裏是我的requireJs配置:

require.config({ 
    baseUrl: 'javascripts', 
    paths: { 
     'angular': '//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min', 
     'angular-route': '//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-route.min', 
     'bootstrapJs': '//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min', 
     'uiBootstrap': '//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.1/ui-bootstrap-tpls.min', 
     'angularAMD': '//cdn.jsdelivr.net/angular.amd/0.2.0/angularAMD.min' 
    }, 
    shim: { 
     'angularAMD': ['angular'], 
     'bootstrapJs': [], 
     'uiBootstrap': ['angular'], 
     'lib/angularSlideables': ['angular'], 
     'lib/ng-infinite-scroll': ['angular'], 
     'angular-route': ['angular'], 
     'lib/angular-modal-service': ['angular'] 
    }, 
    deps: [ 
     'bootstrapJs', 
     'config/routeConfig', 
     'services/authService', 
     'services/usersService', 
     'services/menuService', 
     'controllers/nav', 
     'controllers/main', 
     'lib/angular-modal-service', 
     'config/config', 
     'app' 
    ] 
}); 

當登錄頁面(第一頁的應用程序加載)裝入正確,我看到這個後我打開控制檯:

top of routeConfig 
top of users service 
top of nav controller 
inside routeConfig 
inside users service 
inside nav controller 

但是當頁面加載不正確時,這是我在控制檯中看到的。

top of routeConfig 
inside routeConfig 
top of users service 
top of nav controller 

...那麼錯誤

我不明白的引導過程或requireJs'加載過程足夠弄清楚爲什麼發生這種情況,以及如何解決它。感謝任何有任何想法的人。謝謝。

回答

1

也許這是解決這個問題的最好方法,也許這不是。我放棄了試圖使用require來在require配置中指定任何類型的加載順序或使用任何模塊定義。我強迫它通過讓我的幾個控制器和服務模塊返回應用程序,並讓它們依賴於系列而不是並行,這種強制要求按我指定的順序運行腳本。

因此,不是讓nav.js和usersService.js依賴於爲這兩個組件提供應用程序對象的routeConfig.js,我的服務依賴於routeConfig.js,並且nav.js模塊依賴於在usersService(現在返回它的應用程序對象)。此方法可能會繼續包括其他需要在引導之前加載的控制器和服務。然後我終於打電話給另一個文件,app。js,它調用angular.bootstrap()(在我的情況下爲angularAMD.bootstrap()),現在一切正常。