6

在过去的几个小时里,我试图 concat/uglify 我的angular应用程序gulp,我已经将整个过程简化为简单的 concat,甚至将 angular 文件从 concat 进程删除到<script>标头中的单独请求 - 但我仍然收到相同的错误:

未捕获的类型错误:angular.module(...).factory(...) 不是函数

没有 concat 一切都很好。

我的吞咽任务:

gulp.task('JS', function() {
  gulp.src(['!_dependencies/angular.min.js', '_dependencies/jquery.min.js', '_dependencies/moment.min.js', 'Alpha/_lilhelpers.js', 'Alpha/routes.js' , '!trainerreg.js', '**/*.js'], {cwd: './public/scripts'})         
    .pipe(concat('concat.js'))    
    .pipe(gulp.dest('./public/min'));
});

似乎错误一出现.factory在代码中就会发生。

这是它当前因错误而停止的行 - 它是一个缩小的代码,但我并没有缩小它,我现在只是连接文件,包括angular-animate.min这行代码(实际上是第一个)。
而且,如果我将其删除angular-animate,它将只会在即将进行的另一家工厂上引发错误。

(function(N,f,W){'use strict';f.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(X,r,g){g=g.ngAnimateChildren;f.isString(g)&&0===g.length?r.data("$$ngAnimateChildren",!0):X.$watch(g,function(f){r.data("$$ngAnimateChildren",!!f)})}}).factory("$$animateReflow",["$$rAF","$document",function(f,r){var g=r[0].body;return function(r){return f(function(){r(g.offsetWidth)})}}]).config...

更新:哦,我错了,它不会在 .factory 遇到后立即中断;它一旦在连接文件的缩小部分遇到 .factory 就会中断...

很高兴听到任何解决方案/假设!

4

2 回答 2

11

我找到了!
Chrome 指向错误的行,Firefox 帮助了我一点。错误本身让我感到困惑,只是在一段时间后我才明白这angular.module(...).factory(...)意味着不是.factory未定义,而是试图调用工厂值作为函数返回的东西,即.factory(...)()正在发生。今天终于知道是什么原因了。在我的一个工厂之后,有一些第 3 方代码(在这种情况下是角度动画),它像往常一样被包裹在封闭中,但问题是,我的工厂;最后没有,所以在 concat 之后我有:

.factory('fact', function(){my-factory-code}) (function(args){3rd-party-code})()

环绕闭包被解释为函数调用,因为工厂的行没有被分号终止。如果没有 concat,这个问题就不会出现,因为这个模块在一个单独的文件中。

教训 - 不要忘记我们的同伴;;)

于 2015-10-03T00:55:39.253 回答
3

在没有看到您的工厂代码的情况下,我假设您没有在函数之前声明您的依赖项......这在我过去发生过。确保您的工厂是这样的(并且它包含在一个匿名函数中):

 (function(){
  angular.module('yourModule')
    .factory('YourFactory', ["$scope", "$state", function ($scope, $state){
       //Your Code
    }]);
  }());

对于缩小的 AngularJS 文件,您需要将您的依赖项声明为字符串,以使其正确缩小......并且将您的控制器/工厂/服务包装在匿名函数中始终是一个好主意。我希望这有帮助。

于 2015-10-01T18:45:00.860 回答