Javascript AngularJS控制器是如何定义的?
我有一个关于控制器的语法以及它们在AngularJS中声明的方式的问题。我很确定我知道它们是如何工作的,但我的问题与语法有关 所以我可能会有这样的想法:Javascript AngularJS控制器是如何定义的?,javascript,angularjs,javascript-framework,angularjs-controller,Javascript,Angularjs,Javascript Framework,Angularjs Controller,我有一个关于控制器的语法以及它们在AngularJS中声明的方式的问题。我很确定我知道它们是如何工作的,但我的问题与语法有关 所以我可能会有这样的想法: // MODULE: var weatherApp = angular.module("weatherApp", ['ngRoute', 'ngResource']); // Home Page Controller: weatherApp.controller('homeController', ['$scope', function($s
// MODULE:
var weatherApp = angular.module("weatherApp", ['ngRoute', 'ngResource']);
// Home Page Controller:
weatherApp.controller('homeController', ['$scope', function($scope) {
// Controller business operation
}]);
第一行声明了weatherApp
变量,它是我的模块,与我的页面关联。而module()
是一种将模块名称和此模块使用的依赖项列表作为参数的方法。是这样吗
主要问题与控制器的定义有关
weatherApp.controller('homeController', ['$scope', function($scope) {
// Controller business operation
}]);
在前面的weatherApp
变量(我的模块)中,我调用controller()
方法来设置控制器设置。因此,第一个参数是控制器名称(在本例中为homeController
),后面是一个数组,该数组首先必须包含依赖项列表(在本例中,只有AngularJS提供的$scope
服务)最后一个元素是一个函数,它将这些依赖项作为实现控制器行为的输入参数
为什么要这样做?为什么依赖项和实现控制器的函数都在一个数组中传递
也许我在理解这种行为时有一些困难,因为我来自Java背景,数组不能包含不同类型的对象,函数不是对象。Angular这样定义控制器,因为缩微器重命名参数(例如$scope)在控制器方法中,它打破了Angular的依赖注入机制。请参阅:坏:
weatherApp.controller('homeController', function($scope){
// Controller business operation
});
weatherApp.controller('homeController', ['$scope', function($scope) {
// Controller business operation
}]);
当这被缩小时,参数被缩小,angular将不再能够知道要注入哪些依赖项
好:
weatherApp.controller('homeController', function($scope){
// Controller business operation
});
weatherApp.controller('homeController', ['$scope', function($scope) {
// Controller business operation
}]);
数组语法:字符串中的依赖项使缩小安全
其他正确方式:
weatherApp.controller('homeController', function($scope){
// Controller business operation
});
weatherApp.controller('homeController', ['$scope', function($scope) {
// Controller business operation
}]);
您还可以单独注入依赖项:
function WeatherCtrl($scope, $http) {
// Controller business operation
}
WeatherCtrl.$inject = ['$scope'];
weatherApp.controller('WeatherCtrl', WeatherCtrl);
$injector
必须知道要将哪些参数注入函数。有三种不同的方法告诉喷油器要注射什么
选项1:向函数添加名为$inject
的属性:
FN.$inject=['a','b']
选项2:使用类似数组的注释:
['a','b', function(x,y) {...}]
选项3:如果没有$inject
属性且没有注释,AngularJS将使用函数参数:
function ('a','b') {...}.
您必须始终使用依赖项的名称,这里是a
和b
,而不是依赖项本身
您的示例使用第二种选择
如果缩小代码,则不能使用第三种选择,因为这将更改参数名称
var app = angular.module('app',[])
//with this app reference you define controller like this
app.controller('myCtrl',['$scope',function($scope){
//your stuff
}])
//在这里,我附加了尽可能简单的运行代码
var-app=angular.module('myApp',[])
app.controller('myCtrl',['$scope',函数($scope){
$scope.name=“rahul”;
}])
//这里首先包含角度库
/*单向绑定表达式*/
{{name}}
//双向绑定的ng模型
这主要是为了避免缩小/编译错误。我可以向您推荐以下样式指南:。也许对于初学者来说,遵循风格指南是一件好事,这样你就不会学到错误的东西