2012-08-13 12 views
13

Estoy trabajando en la integración de AngularJs en una aplicación de ejemplo Nodejs. Mi controlador es como sigue:Angularjs se rompe con la expresión de función coffeescript

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

que compila en javascript:

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

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

El código anterior se rompe con el registro de la consola:
error: Argumento 'UsersCtrl' no es una función, quedó definido

Sin embargo, la eliminación de la función anónima alrededor del código JavaScript compilado funciona bien. El código de trabajo se muestra a continuación.

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

Cualquier motivo por el que mi código compilado no funciona. Tengo la sensación de que tiene que ver con la inyección de alcance de Angular. Estoy usando AngularJS 1.0.1

Respuesta

38

Sería mejor utilizar esta sintaxis para que no contaminen el ámbito global:

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

+2

Esta es la forma correcta de hacerlo. – btford

+0

Estoy usando 'angle.module ('myModuleName'). Controller ('MyControllerName', ($ scope) ->)' – vansanblch

+0

Supongo que editaré la publicación con eso para que las personas no se animen a crear variables globales (esas pruebas de desorden malo) –

0

A pesar de que todas las respuestas actuales son derecha hay una tercera opción:

Cuando compila CoffeeScript en JavaScript, asegúrese de establecer la opción --bare en el compilador de CoffeeScript, lo que le hace omitir el contenedor de funciones en la salida.

+2

Hacer eso pondrá todo en el ámbito global, que generalmente es mal visto (y específicamente mencionado en los documentos de AngularJS, pero extrañamente no seguido en su propio tutorial o en los controladores del proyecto de siembra, pero es para directivas, filtros y servicios). – Todd

+0

Acepto que esto no debe hacerse, por la razón (contaminación innecesaria del alcance global) mencionado anteriormente por Todd –

Cuestiones relacionadas