2016-05-06 5 views
1

У меня есть угловой маршрутизатор, который использует функцию разрешения и звонит в службу MyService.Minifier confusing variable name

var Router = function ($stateProvider, $urlRouterProvider) { 

    $stateProvider 
     .state(home, { 
      resolve:{ 
       myFactory: 'MyFactory', 
       checkUser: function(myFactory){ 
        return myFactory.getUser().then(function(data){ 
         // some logic with data 
        }); 
       } 
      }, 
     }); 
}; 

module.exports = ['$stateProvider', '$urlRouterProvider', Router]; 

Когда я запускаю его через Minifier, я в конечном итоге с:

var e = function(t, e) { 

    t.state(home, { 
     url: "/home", 
     resolve: { 
      myFactory: "MyFactory", 
      checkUser: function(t){ 
       return t.getUser().then(function(e){ 

       }); 
      } 
     }, 
    }) 
} 
; 
t.exports = ["$stateProvider", "$urlRouterProvider", e] 

Проблема здесь переменные t и e.

На верхнем уровне:

t = $stateProvider 
e = $urlRouterProvider 

Однако, в моей resolve, t и e используются снова, но:

t = $stateProvider but should = myFactory 
e = $urlRouterProvider but should = data 

И так t.getUser или t.getProducts на самом деле не существует, и, таким образом мои приложение не загружается.

UPDATE:


Аннотированной версия:

var Router = function ($stateProvider, $urlRouterProvider) { 

    $stateProvider 
     .state(home, { 
      resolve:{ 
       myFactory: 'MyFactory', 
       checkUser: ['myFactory', function(myFactory){ 
        return myFactory.getUser().then(function(data){ 
         // some logic with data 
        }); 
       }] 
      }, 
     }); 
}; 

module.exports = ['$stateProvider', '$urlRouterProvider', Router]; 
+1

Я не вижу вашу проблему. В 'resol',' t' - это имя параметра функции checkUser, поэтому любой, кто называет 'checkUser', несет ответственность за предоставление правильного аргумента. –

+0

@ammoQ - спасибо за информацию, ничего в приложении вызывает checkUser, getUser() и getProducts вызываются при загрузке маршрутизатора. –

+1

Извините, моя вина. Прежде всего, нужно было узнать об угловом механизме инъекции. Нашли это: https://docs.angularjs.org/tutorial/step_05, и это: https://docs.angularjs.org/guide/di - оба упоминают проблемы, связанные с аннотацией минимизации и неявной зависимости. –

ответ

1

myFactory - это локальная зависимость в этом резольвере.Как и любая другая зависимость, она должна быть annotated, чтобы правильно вводиться в мини-JS.

  checkUser: ['myFactory', function(myFactory){ 
       return myFactory.getUser().then(function(data){ 
        // some logic with data 
       }); 
      }] 

Strict mode может быть использован, чтобы избежать такого рода ошибок в производстве.

+0

Спасибо за это, я добавил аннотированное обновление, см. Выше. Когда я копирую этот код, в minifier, например https://javascript-minifier.com/, то же самое происходит с моим OP в том, что myFactory.getUser() становится e.getUser –

+0

@OamPsy Это нормальное поведение. 'e' относится к локальной переменной и может использоваться несколько раз в разных контекстах функций. Он не мешает Угловому DI, если функция аннотируется должным образом. – estus

0

Это, по существу, проблема с доступом к объектам и их свойствам внутри «методы» объект, как написано не- должным образом.

Я сделал вам Fiddle Example of Object Access, который показывает, как вы можете получить доступ к свойствам объектов и как различать доступ к его свойствам и аргументы, переданные этим функциям.

Чтобы исправить вашу конкретную ошибку, ваше решение, вероятно, должно выглядеть так, но я бы посоветовал вам проверить пример скрипки и попытаться выяснить ее сами. У меня есть 0 опыта с угловым, от того, что я понимаю твой может ссылаться на $ объема там, который будет выступать в качестве замены для this, но, как я сказал, что я не знаком, надеюсь, что это помогает:

resolve:{ 
      self: this, 
      myFactory: 'MyFactory', 
      checkUser: function(){ 
       return self.myFactory.getUser().then(function(data){ 
        // some logic with data 
       }); 
      } 
     }, 
+0

спасибо, с этим я вижу: Ошибка: [ng: areq] Аргумент 'fn' не является функцией, получил undefined –

+1

Вы уверены, что ошибка исходит из этой части кода, вы можете заменить '// некоторую логику с данными 'с предупреждением (« Я ввел здесь »);' и проверить, что он не выполняется (сделать его первой линией этой функции)? Я не уверен, где угловой привязывает аргумент 'fn' к какому вызову, но здесь не должен быть этот метод. Можете ли вы проверить, что «предупреждение (« Я ввел здесь »),' не происходит? – Dellirium

+0

попробовали консольный журнал, ничего не регистрируется. Однако, если я использую мою незаменимую версию, появится журнал. –

0

Это стандартный Minifier подход , чтобы уменьшить код, он также изменяет имена переменных на меньшие.

Вы можете решить тремя способами:

а) в Minifier вы должны указать не изменять имена переменных. (Например mangle: false в уродовать плагин)

б) использовать угловые обозначения массива, например:

angular.service(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) { .... } ]); 

) использовать $ впрыснуть свойства, например:

var Router = function ($stateProvider, $urlRouterProvider) { 
    $stateProvider 
     .state(home, { 
      resolve:{ 
       myFactory: 'MyFactory', 
       checkUser: function(myFactory){ 
        return myFactory.getUser().then(function(data){ 
        // some logic with data 
       }); 
      } 
     }, 
    }); 
}; 
Router.$inject = ['$stateProvider', '$urlRouterProvider']; 
module.exports = ['$stateProvider', '$urlRouterProvider', Router]; 

В вашем конкретном случае только a) и c) будет работать

1

Yeap. Вам нужна NG-Annotate. Для Gulp, например, я использовал this one.