【问题标题】:Angular module().factory() is not a function after concat (gulp)Angular module().factory() 不是 concat (gulp) 之后的函数
【发布时间】:2015-12-29 21:43:14
【问题描述】:

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

未捕获的 TypeError: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,它就会中断...

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

【问题讨论】:

    标签: angularjs gulp typeerror gulp-concat


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢伙计!可能为我节省了几个小时! :)
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢回答!事情是,正如我已经提到的,我已经将 procces 剥离为仅 concat,即没有缩小,是的,你是对的,我没有以这种方式声明依赖关系,我现在意识到它可能会导致缩小问题,我想我会使用一些自动准备插件在缩小之前添加这样的声明。我将提供它目前使用的工厂代码。
    猜你喜欢
    • 2017-02-08
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多