首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x.controller与.controller的区别

x.controller与.controller的区别
EN

Stack Overflow用户
提问于 2014-07-27 04:38:35
回答 2查看 153关注 0票数 2

我有一个主app.js文件,它的定义代码如下所示:

代码语言:javascript
复制
var app = angular.module('Funapp', [
  'Funapp.controllers', 
  'Funapp.services', 
  ])

我想知道为什么对于我的js控制器文件,我可以使用app.controller,而另一些我必须编写angular.module(){} etc来代替.controller?app.controller不适用于第二种情况。

例如。app.controller为我的发帖控制器工作。

代码语言:javascript
复制
'use strict';
app.controller('PostsCtrl', function ($scope, Post) { ...etc 

但是在工厂等其他js文件中不起作用,所以我必须按下面的方式键入它

代码语言:javascript
复制
'use strict';
angular.module('Funapp.services', [])
.factory('Post', function ($firebase, FIREBASE_URL) {....etc  

在post视图或虚拟控制器中也不工作,下面是后置控制器

代码语言:javascript
复制
'use strict';
//angular.module('Funapp') --> Doesnt work currently, neither does Funapp.controller

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

有人能告诉我如何使用app.controller和.controller吗?如果是后者,我应该考虑在angular.module中输入什么(“”,[])?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-27 05:10:20

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

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

代码语言:javascript
复制
var app = angular.module("demoApp", ['demoApp.services']);
var appServices = angular.module('demoApp.services', []);

这需要预先加载,并且当您导航到任何其他页面时都需要在其中,因为您的其他页面是同一应用程序的一部分,并且还需要在该应用程序上定义服务。

HomeCtrl.js

代码语言:javascript
复制
app.controller("homeCtrl", function ($scope) {
    $scope.msg = "Home!";
});

amd AboutCtrl.js

代码语言:javascript
复制
app.controller("aboutCtrl", function ($scope,svc1) {
    $scope.msg = "About!";
    svc1.sayHi();
});

现在在Home.html

代码语言:javascript
复制
<divng-controller="homeCtrl">
    <h1>{{msg}}</h1>
</div>

About.html

代码语言:javascript
复制
<script src="~/app/Svc1.js"></script>
<script src="~/app/AboutCtrl.js"></script>

<div ng-controller="aboutCtrl">{{msg}}</p>

Svc1.js看起来是这样的:

代码语言:javascript
复制
appServices.service("svc1", function () {
    return {
        sayHi: function () {
            alert("hi");
        }
    };
});

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

票数 2
EN

Stack Overflow用户

发布于 2014-07-27 05:25:33

在命名空间中,您的各个对象都处于正确的轨道,需要为每个构造定义模块。

下面是一个例子

代码语言:javascript
复制
<!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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24977951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档