Javascript x.controller和.controller之间的差异

Javascript x.controller和.controller之间的差异,javascript,node.js,angularjs,Javascript,Node.js,Angularjs,我有一个主app.js文件,其定义代码如下: var app = angular.module('Funapp', [ 'Funapp.controllers', 'Funapp.services', ]) 我想知道为什么对于我的一些js控制器文件,我可以使用app.controller,而对于其他文件,我必须编写angular.module(){}等来使用.controller?app.controller不适用于第二种情况 比如说。app.controller适用于我的发布

我有一个主app.js文件,其定义代码如下:

var app = angular.module('Funapp', [
  'Funapp.controllers', 
  'Funapp.services', 
  ])
我想知道为什么对于我的一些js控制器文件,我可以使用app.controller,而对于其他文件,我必须编写angular.module(){}等来使用.controller?app.controller不适用于第二种情况

比如说。app.controller适用于我的发布控制器

'use strict';
app.controller('PostsCtrl', function ($scope, Post) { ...etc 
但在其他js文件(如factory)中不起作用,所以我必须按如下方式键入它

'use strict';
angular.module('Funapp.services', [])
.factory('Post', function ($firebase, FIREBASE_URL) {....etc  
在后视图或虚拟控制器中也不工作,后视图控制器如下

'use strict';
//angular.module('Funapp') --> Doesnt work currently, neither does Funapp.controller

app.controller('PostViewCtrl', function ($scope, $routeParams, Post) { ...etc 

有人能启发我如何使用AppController和.Controller,如果后者,我应该考虑在角模块(“,”[])中键入什么?


我已经阅读了angular教程,并且理解angular.module(“,[])定义了该模块,而angular.module(“”)使用该定义的模块。然而,我遇到了很多错误,我无法正确地解决问题,也无法理解这是如何工作的

这完全取决于主应用程序定义文件是否已加载,并且在您到达需要
PostViewCtrl
的视图时是否在范围内。如果已经加载并可供DOM使用,则意味着您可以使用
app.controller
语法,因为您已经声明了它及其依赖项。如果DOM不能使用它,那么您需要做您已经在做的事情,从最佳实践的角度来看,这是一件痛苦和可怕的事情。例如,如果您有一个包含应用程序定义的脚本的主页面,则该shell页面中承载的其他视图可能包含由
app.controller
声明的控制器,但如果您有服务器端视图,并且主应用程序定义脚本不包含在母版页中(ASP.NET概念)然后,每当您希望在每个服务器端视图中创建控制器时,都需要重新声明应用程序定义

例如,假设您有两个页面,
主页
关于
。每个控制器在单独的文件中都有单独的控制器定义:
app.js
如下所示:

var app = angular.module("demoApp", ['demoApp.services']);
var appServices = angular.module('demoApp.services', []);
appServices.service("svc1", function () {
    return {
        sayHi: function () {
            alert("hi");
        }
    };
});
因为你的其他页面是同一个应用程序的一部分,并且还需要在该应用程序上定义服务,所以需要提前加载,并且在你导航到任何其他页面时都需要存在

HomeCtrl.js

app.controller("homeCtrl", function ($scope) {
    $scope.msg = "Home!";
});
app.controller("aboutCtrl", function ($scope,svc1) {
    $scope.msg = "About!";
    svc1.sayHi();
});
amd
关于trl.js

app.controller("homeCtrl", function ($scope) {
    $scope.msg = "Home!";
});
app.controller("aboutCtrl", function ($scope,svc1) {
    $scope.msg = "About!";
    svc1.sayHi();
});
现在进入
Home.html

<divng-controller="homeCtrl">
    <h1>{{msg}}</h1>
</div>
<script src="~/app/Svc1.js"></script>
<script src="~/app/AboutCtrl.js"></script>

<div ng-controller="aboutCtrl">{{msg}}</p>
Svc1.js
看起来是这样的:

var app = angular.module("demoApp", ['demoApp.services']);
var appServices = angular.module('demoApp.services', []);
appServices.service("svc1", function () {
    return {
        sayHi: function () {
            alert("hi");
        }
    };
});

长话短说,引用应用程序模块的
app
appServices
变量在应用程序上声明服务或控制器时需要在范围内,否则您必须始终重新定义应用程序。

您在为各种对象命名空间方面走的是正确的,您需要为每个构造定义模块

这里有一个例子

<!doctype html>
<html ng-app="Funapp">
<head>
   <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
</head>
<body ng-controller="PostsCtrl">

<div class="well">
    <h1>{{message}}</h1>
</div>

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.17/angular.min.js"></script>
<script>

angular.module('Funapp.services', [])
    .service('PostService', [function () {
        return {
            doSomething: function() {
                    return "I posted something";
            }   
        }

    }]);

angular.module('Funapp.controllers', ['Funapp.services'])
    .controller('PostsCtrl', ['$scope', 'PostService', function ($scope, Post) {    
        $scope.message = Post.doSomething();
        console.log("I'm a Post Controller");
    }
    ]);

angular.module('Funapp', [
  'Funapp.controllers'
]);

</script>
</body>
</html>

{{message}}
angular.module('Funapp.services',[])
.service('PostService',[功能(){
返回{
doSomething:function(){
返回“我发布了一些东西”;
}   
}
}]);
angular.module('Funapp.controllers',['Funapp.services']))
.controller('PostsCtrl',['$scope','PostService',函数($scope,Post){
$scope.message=Post.doSomething();
log(“我是邮政管理员”);
}
]);
角度模块('Funapp'[
“Funapp.controllers”
]);

创建名称空间和模块化应用程序当然是一种很好的做法,但每次都重新声明应用程序,因为它对DOM不可用,这只是代码复制和维护的噩梦。我不能完全确定@MohammadSepahvand的观点,我要说的是,如何设置代码库实际上取决于应用程序的大小。在我的工作中,我们已经将我们相当大的应用程序分解为一个功能设置,并且有许多模块,而不是一个模块。当您需要共享服务和过滤器等东西时,它们会被放入一个公共模块中。我确实同意,如果你不小心,在看起来你会有维护噩梦时不重构,事情可能会失控。IMHOI完全同意你所说的,但我只是给了一个提示,不是在问题上添加补丁,而是在所有地方重新定义相同的应用程序。在这种情况下,如果我希望使用app.factory作为第二个代码,我如何更改哪些文件以使其有效?我需要编辑主app.js定义吗?我所有的控制器都在单独的js文件中

我希望更改的原因是我对js文件的理解不足,这可能会导致我将来在js文件中出现令人沮丧的错误。服务也是如此。您为其创建服务的应用程序也必须在您编写“app.service”时加载,主要是在向其添加服务/控制器等时将模块定义就绪。在启动时加载
var-appServices=angular.module('Funapp.services',[])
声明,并确保它可用于所有需要它的页面,现在如果您希望创建另一个服务,考虑到包含
appServices
变量的脚本可用,只需执行
appService.factory()
。。