2017-06-15 47 views
0

所以我有麻烦管理我的节点应用程序的依赖关系。的结构如下角模块依赖注入不按预期工作

app.js

var app = angular.module('myApp', ['myController', 'myFactory', 'rzModule', 'chart.js', 'myService', 'selector']); 

myController.js

var app = angular.module('myApp', ['chart.js', 'rzModule', 'selector']); 
app.controller('myController', function($scope, $http, $rootScope, myFactory, mySecondService){ ... }]); 

myFactory.js

angular.module('myApp').factory('myFactory', function($http, $rootScope){ ... }); 

myService.js

angular.module('myApp').service('myService', function($http){...}); 

上面的结构工作,应用程序按预期运行。但是我不认为我在myController.js中所做的是正确的,因为我现在想要添加另一个依赖关系,并且我不知道如何在没有应用程序崩溃的情况下执行此操作。

问题1:在上面的myController.js中,我想我正在创建一个新模块,而不是重用app.js中的一个,是否正确?如果是这样,内嵌移动3依赖性就像下面这个结果“是myController的不可用”:

var app = angular.module('myApp'); 
app.controller('myController',['chart.js', 'rzModule', 'selector', function(...) 

为什么这个不行?根据documentation它应该。我想将angular-moment添加到myController中。该指示说我应该将'angularMoment'作为依赖项添加到app.js,然后'moment'添加到控制器依赖项。如果我这样做,并像问题1一样添加内联'moment',则我再次遇到“myController不可用”错误。

+0

'app.controller('myController',['chart.js','rzMo ....'是继续的方式,文件的序列是什么? – Satpal

+0

@Satpal是我的猜测,但是作为提到,它导致控制器不可用 – ffritz

+0

为什么你在'angular.module('myApp'' decleration? – ymz

回答

2

所以回答你的问题 快的事情,你有angularjs继续之前,模块需要注入器应用程序没有到控制器,所以任何模块,包括需要在应用中被注入。

var app = angular.module('myApp', [<all modules comma separated>]); 

同样的控制器可以有这些模块定义了注入myApp

你不能注入控制器,其要么链接到myApp(如服务,工厂等)所有这些依赖关系和这些服务在对myApp只有模块的服务可以有

注入问题1

var app = angular.module('myApp', ['chart.js', 'rzModule', 'selector']); 
app.controller('myController', function(...) 

这shold工作,并利用这一点,并不意味着你正在创建任何新的应用程序

问题2

var app = angular.module('myApp', ['angularMoment']); 
app.controller('myController', ['moment', function(...) 

这样你可以使用瞬间的对象。

+0

非常感谢。所以关于'angularMoment',它需要注入到app.js和相应的控制器中吗?控制器/服务使用的任何其他模块也一样?我根据这个调整了自己的代码,现在有一个问题,'myService'在myController中未定义,并且在'moment'旁边注入它并不能解决它。 – ffritz

+0

- 更新:看起来像在内联注入服务时,您还必须注入所有其他人,如'$ scope'和'$ http'。现在工作! – ffritz

+0

太棒了,很高兴听到! –

1

正如Satpal说

app.controller('myController',['chart.js', 'rzMo 

是要走的路,或者写这将是做这样的事情一个更清洁的方式。

angular.module('myApp').controller('myController'); 

myController.$inject = ['$scope', '$http', '$rootScope', 'myFactory', 'mySecondService'] 

function myController($scope, $http, $rootScope, myFactory, mySecondService){} 

原因myController不可与修复的是,它现在你没有覆盖的主要应用模块,它在寻找一个叫myController模块不能被发现(因为它是一个控制器,而不是一个模块)。所以删除'myController'var app = angular.module('myApp', ['myController'

我建议你看看John Papa's Style Guide for AngularJS它可以有助于编写干净的代码。

+1

我认为注入应该看起来像这样:'myController。$ inject = ['$ scope'...]'第二个导致'名为'myController'的控制器不是reg istered.'为我。 – ffritz

+0

@ffritz你说得对,当我从代码中复制它时,忘了改变它。我认为Lalit Sachdeva的回答是更好的解释tbh。 – George

0

Ans 1: 是的,在第二种情况下,您正试图再次定义它。 要定义一个应用程序使用:

angular.module('myApp', [..list of dependancies...]); 

现在,如果你想在前面的模块使用定义控制器

angular.module('myApp').controller(); 

现在来注入你的3个依赖关系,它们移动到已定义的顶你应用程序。回答2:您必须向您的控制器注入angularMoment到您的应用程序和时刻。

在angular中处理依赖注入的最好方法是使用$ inject。比如你控制器看起来像

angular.module('myApp').controller('myController', myController); 

myController.$inject = ['moment','$scope', '$http', '$rootScope', 'myFactory', 'mySecondService'] 
function myController(moment, $scope, $http, $rootScope, myFactory, mySecondService){ 
    //your controller code. 
} 

,否则你可以尝试以下以及

angular.module('myApp').controller('myController',['moment','$scope', '$http', '$rootScope', 'myFactory', 'mySecondService', function myController(moment, $scope, $http, $rootScope, myFactory, mySecondService){ 
    //your controller code. 
}]); 

下也可以工作,但不推荐使用;

angular.module('myApp').controller('myController',function myController(moment, $scope, $http, $rootScope, myFactory, mySecondService){ 
     //your controller code. 
    });