【问题标题】:Angularjs breaks with coffeescript function expressionAngularjs 打破了 coffeescript 函数表达式
【发布时间】:2012-08-09 06:12:56
【问题描述】:

我正在将 AngularJs 集成到一个示例 Nodejs 应用程序中。我的控制器如下:

UsersCtrl = ($scope, $http) ->    
   $scope.newUser = {}
   $scope.users = [
     name: "aloman"
     email: "aloman@example.com"
   ]

编译成javascript:

// Generated by CoffeeScript 1.3.3
(function() {
  var UsersCtrl;

  UsersCtrl = function($scope, $http) {
    $scope.newUser = {}; 
    return $scope.users = [ 
      {   
        name: "aloman",
        email: "aloman@example.com"
      }   
    ];  
  };
}).call(this);

上面的代码与控制台日志中断:
错误:参数“UsersCtrl”不是函数,未定义

但是,删除包裹在已编译 javascript 周围的匿名函数可以正常工作。 工作代码如下所示。

var UsersCtrl;
Usersctrl = function($scope, $http) {
    $scope.newUser = {};
    $scope.users = [{
        name: "aloman",
        email: "aloman@example.com" 
    }];
}; 

我的编译代码不起作用的任何原因。我觉得这与 Angular 的作用域注入有关。我正在使用 AngularJS 1.0.1

【问题讨论】:

    标签: javascript coffeescript angularjs


    【解决方案1】:

    最好使用这种语法,以免污染全局范围:

    angular.module('myApp').controller('MyController', ($scope) ->)

    【讨论】:

    • 我正在使用angular.module('myModuleName').controller('MyControllerName', ($scope) ->)
    • 我想我会用它来编辑帖子,这样就不鼓励人们创建全局变量(那些搞砸测试不好)
    • 我相信您需要一个空数组作为模块名称之后的第二个参数。 angular.module('myApp', []).controller('MyController', ($scope) ->)
    • 如果您提供空数组,它将创建一个名为“myApp”的新模块,没有依赖项。如果您没有数组,它只会获取现有的“myApp”模块。
    【解决方案2】:

    尽管所有当前的答案都是正确的,但还有第三种选择:

    当您将 CoffeeScript 编译为 JavaScript 时,请确保将 --bare 选项设置为 CoffeeScript 编译器,这会使他在输出中省略函数包装器。

    【讨论】:

    • 这样做会将所有内容置于全局范围内,这通常是不受欢迎的(并且在 AngularJS 文档中特别提到,但奇怪的是在他们自己的教程或种子项目的控制器中没有遵循——但用于指令、过滤器和服务)。
    • 我同意不应该这样做,因为 Todd 上面提到的原因(不必要地污染了全局范围)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多