2012-09-29 30 views
24

我想我的控制器分割成多个文件,但是当我尝试在我的模块IM注册他们得到一个错误:AngularJS:我如何在多个文件中创建控制器

groupcontroller.coffee

app = angular.module('WebChat', []); 
app.controller 'GroupController', ($scope) -> 

usercontroller.coffee

app = angular.module('WebChat', []); 
app.controller 'UserController', ($scope) -> 

错误

错误:参数“GroupController”不是一个函数,得到了不确定

从我真的不得到什么模块方法不反正文档。它是否使用密钥“网聊”存储我的控制器?

编辑: 这似乎也传递[]创建一个新的模块,并覆盖前一个

app = angular.module('WebChat', []); 

为了防止这种情况,你要离开了【喜欢

app = angular.module('WebChat'); 
+7

用于编辑的+1解释将'[]'作为模块方法的第二个参数传递覆盖前一个参数。 – semperos

+0

@ user1703761:谢谢你!编辑+1。 – 2013-07-18 19:41:15

回答

6

检查您的代码中引用'GroupController'的其他地方(可能在您的路线中)。机会是你有它作为一个变量,但是当你在一个模块中声明一个控制器,你必须包装它的报价。 EG:

MyCtrl1() = ->() 
... 
$routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: MyCtrl1}) 

工作正常,因为MyCtrl1是一个变量。但是,当您在模块中声明控制器时:

app = angular.module('WebChat', []); 
app.controller 'GroupController', ($scope) -> 
    # ... 

$routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'GroupController'}) 

'GroupController'需要路由中的引号。

+0

谢谢,解决了这个问题 – user1703761

13

这里是我做过什么:

的index.html

<script src="js/angular.js" type="text/javascript" charset="utf-8"></script> 
<script src="js/myApp.js" type="text/javascript" charset="utf-8"></script> 
<script src="js/myCtrlA.js" type="text/javascript" charset="utf-8"></script> 
<script src="js/myCtrlB.js" type="text/javascript" charset="utf-8"></script> 

app.js

myApp = angular.module('myApp', []) 
myApp.config ($routeProvider) -> 
    $routeProvider.when('/a', {controller: 'myCtrlA', templateUrl: 'a.html'}) 
    $routeProvider.when('/b', {controller: 'myCtrlB', templateUrl: 'b.html'}) 

myCtrlA.js

angular.module('myApp').controller 'myCtrlA', ($scope) -> 
    console.log 'this is myCtrlA' 

myCtrlB.js

angular.module('myApp').controller 'myCtrlB', ($scope) -> 
    console.log 'this is myCtrlB' 

正如你所看到的,如果我有很多控制器js文件, 这将成为index.html中的很多脚本元素。
我不知道该如何处理。

FYI:http://briantford.com/blog/huuuuuge-angular-apps.html
但本文没有提及html文件。

+2

html页面的顺序很重要,我用grunt和concat创建了一个js文件,但得到了第一个放置angular.module声明后找不到模块xy的错误一切工作正常:-)。 – Sebastian

3

我有我的应用程序var definied在我的应用程序。首先引用js文件女巫,然后控制器文件例如FirstCtrl.js。

所以在app.js前

var app = angular.module(... 

在FirstCtrl.js

app.controller('FirstCtrl', 
0

有一个简单的解决这个问题。 在编译之前连接* .coffee文件。 如果使用 '一饮而尽' 你可以这样创建任务:

gulp.src(['./assets/js/ng/**/*.coffee']) 
    .pipe(concat('main.coffee')) 
    .pipe(coffee()) 
    .pipe(ngmin()) 
    .pipe(gulp.dest('./public/static/js/app')) 
    .pipe(livereload(server)); 

例如:

chat.coffee

myChat = angular.module 'myChat', [] 

msg.coffee

myChat 
.directive 'message',() -> 
    return { 
     restrict: 'E' 
     replace : true 
     transclude: true 
     scope: true 
     template: '<div></div>' 
    } 

串连后并编译我们有:

(function() { 
    var myChat; 
    myChat = angular.module('myChat', []); 
    myChat.directive('message', function() { 
    return { 
     restrict: 'E', 
     replace: true, 
     transclude: true, 
     scope: true, 
     template: '<div></div>' 
    }; 
    }); 

}.call(this)); 

享受!

相关问题