2012-08-13 11 views
13

Sto lavorando per integrare AngularJs in un'applicazione Nodejs di esempio. Il mio controller è la seguente:Angularjs si interrompe con l'espressione della funzione coffeescript

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

che compila in 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); 

Il codice di cui sopra rompe con log della console:
Errore: argomento 'UsersCtrl' non è una funzione, ottenuto indefinita

Tuttavia la rimozione della funzione anonima racchiusa nel javascript compilato funziona correttamente. Il codice funzionante è mostrato sotto.

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

Qualsiasi motivo per cui il mio codice compilato non funziona. Ho la sensazione che abbia a che fare con l'iniezione ottica di Angular. Sto usando AngularJS 1.0.1

risposta

38

Sarebbe meglio usare questa sintassi in modo da non inquinare l'ambito globale:

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

+2

Questo è il modo giusto per farlo. – btford

+0

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

+0

Suppongo che modificherò il post con quello in modo che le persone non siano incoraggiate a creare variabili globali (quei pasticci non funzionano bene) –

0

Nonostante che tutte le risposte attuali sono a destra c'è un terzo opzione:

Quando si compila CoffeeScript su JavaScript, assicurarsi di impostare l'opzione --bare al compilatore CoffeeScript, che gli consente di omettere la funzione wrapper nell'output.

+2

Fare ciò metterà tutto nello scope globale, che è generalmente disapprovato (e specificamente chiamato nei documenti AngularJS ma stranamente non seguito nei loro tutorial o nei controller del seed project - ma è per direttive, filtri e servizi). – Todd

+0

Sono d'accordo che questo non dovrebbe essere fatto, per la ragione (inquadrando inutilmente l'ambito globale) sopra menzionata da Todd –

Problemi correlati