Visual Studio';s AngularJS模板说明
当我使用VS2015模板创建新控制器时,我得到以下代码:Visual Studio';s AngularJS模板说明,angularjs,visual-studio-2015,angularjs-controller,angularjs-injector,self-invoking-function,Angularjs,Visual Studio 2015,Angularjs Controller,Angularjs Injector,Self Invoking Function,当我使用VS2015模板创建新控制器时,我得到以下代码: (function () { 'use strict'; angular .module('app') .controller('controller', controller); controller.$inject = ['$scope']; function controller($scope) { $scope.title = 'control
(function () {
'use strict';
angular
.module('app')
.controller('controller', controller);
controller.$inject = ['$scope'];
function controller($scope) {
$scope.title = 'controller';
activate();
function activate() { }
}
})();
问题:
activate()
函数的作用是什么?我应该在里面写什么代码?为什么我需要一个单独的函数而不是只在控制器里面写代码控制器。$inject=['$scope']
认为将依赖项写入数组(作为控制器函数的参数)是一种更好的做法controller
将在缺少IIFE的情况下成为全局命名空间的成员
activate()
函数的作用是什么
它有助于分别分离控制器变量和代码的声明和执行。在调用activate
函数之前,我们通常使用this.
语法将所有依赖项声明为控制器成员
您将在activate
函数中写入执行代码
执行控制器。$inject=['$scope']代码>被认为是更好的做法
事实上是的!它可以帮助您将控制器定义与其角度对应项分开。它帮助您避免在angular.module(…).controller
块中写入整个控制器代码,以提高代码的可读性
编辑1:
如果没有IIFE,名为controller
的函数将成为全局命名空间的成员,并且可以在整个页面中访问。它还可能被后续代码覆盖。不要将AngularJS与此混合,因为这是JavaScript所做的事情
activate
功能只是一个分离关注点的层。您可以完全在函数控制器
中编写代码。但这样,就很难区分哪个代码控制器正在执行,哪些代码将变量绑定到控制器。举个例子:
function controller($scope) {
var vm = this;
vm.data = [];
$scope.title = 'controller';
activate();
///
function activate() {
getData()
.then(data => {
// do something with data
});
// ...
}
function getData() {
...
}
}
通过阅读上面的代码,您可以很容易地了解控制器中正在使用的变量,而无需特别深入控制器的深度。通过遵循此约定,我们将始终知道控制器将在调用activate()
的位置开始执行业务逻辑。准确、准确的回答。感谢您的回答,如果您能详细说明-1。为什么控制器成为没有IIFE的全局命名空间的成员,我将不胜感激?angular是否神奇地将控制器实例“附加”到其定义的范围?当我使用生命的时候,它在哪里?2.关于激活功能-您能否添加一个小代码示例来说明激活功能内部和外部的内容?(在我看来,我所有的控制器代码都是我添加到scope/controller中的变量/函数的“声明”。@BornToCode——请查看更新的答案。我希望这能帮助你更好地理解它。所以如果我把它和C#比较一下,那么activate()就像一个构造函数,“类成员”是在activate之前定义的,对吗?如果我正确理解这一行angular.module('app').controller('controller',controller)
只定义了一个控制器,当加载带有ng controller=“controller”的视图时,该控制器将被启动。我缺少了角度魔法部分,它何时“粘贴”到全局名称空间,以及在我使用IIFE时在何处“粘贴”?@BornToCode——正如我所提到的,您可以编写整个逻辑,而不必使用activate
。但是,是的,只是为了类似于构造函数一样的函数,这是适当的。