2015-11-29 2 views
0

Я прошел через сообщения о неправильной инъекции зависимостей и возникающих ошибках в минифицированном коде и не смог понять, почему я получаю его здесь.ngAnnotate не работает на ES6-классах без методов экземпляра

это производит $injector:unpr ошибку, когда уменьшенная

// Projects.projects = ['array', 'of', 'stuff'] 
import { Projects } from './projects'; 

export class PortfolioController 
{ 
    /* @ngInject */ 
    constructor($state) 
    { 
     this.$state = $state; 
     this.projects = new Projects().projects; 
    } 
} 

это minifies без ошибок

import { Projects } from './projects'; 

export class PortfolioController 
{ 
    /* @ngInject */ 
    constructor($state) 
    { 
     this.$state = $state; 
     this.projects = new Projects().projects; 
     this.Init(); 
    } 

    Init() 
    { 
     this.$state.name === 'portfolio' ? 
      console.log('PortfolioController instantiated') : 
      console.log('no-go'); 
    } 
} 

регистрация контроллер/состояние конфигурации в случае, который помогает

'use strict'; 

import { PortfolioController } from './portfolio.controller'; 

angular.module('myApp') 
    .controller('PortfolioController', PortfolioController) 
    .config(['$stateProvider', Config]); 


function Config($stateProvider) 
{ 
    // NOTE: adding this fixes the issue, but this does not seem like an ideal scenario 
    PortfolioController.$inject = ['$state']; 

    $stateProvider 

    .state('portfolio', 
    { 
     url: '/portfolio', 
     views: { 
      'portfolio': { 
       templateUrl: 'app/portfolio/views/portfolio.html', 
       controller: PortfolioController, 
       controllerAs: 'vm' 
      } 
     } 
    }); 
} 

Идеи?

обновление - подумал, что может быть полезно включить модуль setter.

'use strict'; 

angular.module('myApp', ['ngCookies', 'ngResource', 'ngSanitize', 'ui.router', 'ui.bootstrap', 'ngAnimate']) 
    .config(['$urlRouterProvider', '$locationProvider', '$animateProvider', Config]) 
    .run(['$rootScope', '$state', Run]); 

function Config($urlRouterProvider, $locationProvider, $animateProvider) 
{ 
    // basic ui.router config 
} 

function Run($rootScope, $state) 
{ 
    // actions that occur when the app runs 
} 
+0

Have Вы сравнили unminified выход, чтобы увидеть, если '/ * @ngInject * /' еще в разумное место после того, как Вавилон обработал файл? – loganfsmyth

+0

Я не уверен, что было бы необоснованным размещением, но после того, как код прошел через Babel и Browserify, '/ * @ ngInject * /' над этой строкой: 'export.PortfolioController = function PortfolioController ($ state) {. ..}; ' – MyCompassSpins

+0

Я обнаружил (используя' ng-di-strict' в dev), что он работает, если я поместил 'PortfolioController. $ Injection = ['$ state'];' в мою конфигурационную функцию состояния. Впрочем, это тоже не идеально. , , – MyCompassSpins

ответ

0

Я думаю, что это не имеет ничего общего с аннотациями, так как они должны нормально работать даже в сокращенной версии кода.

Что я могу сказать вам точно, и это также, вероятно, дает вам точное сообщение об ошибке, которое вы получаете, это то, что вы используете ui.router, но вы не вводите в качестве модуля в качестве зависимости.

Убедитесь, что вы библиотека загружается в вашем браузере, а затем вводят его в модуль:

angular.module('myApp', ['ui.router']) 
    .controller('PortfolioController', PortfolioController) 
    .config(['$stateProvider', Config]) 
+0

Я готов принять понятие о том, что проблема не с ngAnnotate, но это тоже не 'ui.router', я не думаю. Эта ошибка возникает при создании экземпляра контроллера. Я также обновлю свой вопрос с помощью модуля setter, если это будет полезно. – MyCompassSpins

+0

Ну, я не активно работал с ngAnnotate, но ошибка «unkown provider», безусловно, может появиться, когда вы пропустите зависимость от уровня модуля. – FlorianTopf

Смежные вопросы