angularjs 中的命名空间并不是最强大的部分。事情最终会转到一个名为angular
. 那里定义了几个可用于创建对象的函数,例如module
. 这对于服务名称(我们依赖使用服务名称的依赖注入)或全局函数控制器特别有问题。模块是一组逻辑组,例如指令或控制器,但(不太确定)它不是隔离组件的方法。尝试在两个模块中使用同名指令。在教程中,他们将控制器定义为全局函数:
function MainCtrl() {...}
而不是使用模块,至少不会污染全局命名空间。
app.controller('MainCtrl', function ($scope) {
angular.directive() 返回一个 DDO(指令定义对象),例如:
app.directive('person', function () {
return {
restrict: 'E',
replace: true,
template: '<div class="person">Person name: {{ name }}</div>',
scope: {
name: '@'
}
};
});
您应该使用一组有限的属性(restrict、replace、template、templateUrl...)。
在function aFunction() { ... }
那里没有多大意义。它甚至不是key:value
。如果它是一个在指令中封装一些逻辑但不必暴露给视图的函数,则可以如下所示:
app.directive('person', function () {
var f = function() {...};
return {
restrict: 'E',
replace: true,
template: '<div class="person">Person name: {{ name }}</div>',
link: function(...) {
/* and it becomes available */
f()
}
};
});
如果您不使用var
,它会尝试按照 javascript 范围规则将其解析为全局对象。
您的第二个示例var aVar = function anotherFunction() { ... }
是仅在当前 [javascript] 范围内可用的函数,即在您拥有的任何函数中。例如:
link: function(...) {
/* and it becomes available */
f();
var g = function () {...};
g(); // only works in the scope of link();
}
如果您想要将此功能公开给视图,那么<div ng-click="fireFn()">
您可能应该将它放在范围内。在范围内定义此函数的好地方是控制器或链接函数:在控制器中,
app.controller('MainCtrl', function ($scope) {
$scope.name = 'World';
$scope.fireFn = function() {...}; // scope is the injected service. use the $
});
在链接器中:
link: function(scope) {
/* and it becomes available */
f();
var g = function () {...};
g(); // only works in the javascript scope (not the parameter!) of link();
scope.fireFn = function() {...}; // scope is the first parameter
}
至于隔离模块,将它们放在闭包中不会造成任何伤害:
(function () {
"use strict";
var mymodule = angular.module('mymodule', []);
}());