angularjs不会污染全球
Not polluting global with angularjs
在angularjs中,我们将控制器定义为window
。虽然这不会造成与其他js
模块和插件的名称冲突,但这仍然不是一个好的做法:单个应用程序应该向全局命名空间公开单个对象。
这是window
:中定义的常用方式
function UserController($scope) { ... }
HTML:
<div ng-controller="UserController">
这就是我的想法:
myApp.UserController = function ($scope) { ... };
所以在这种情况下,我应该从html启动控制器,就像这个
<div ng-controller="myApp.UserController">
你觉得怎么样?
绕过它的方法之一是在Angular本身中定义它,如您所描述的方式。换句话说:
angular.module('YourApp').controller('ControllerName', function($scope) {})
我已经确认上述方法不会污染全局命名空间。
编辑:您也不需要使用<div ng-controller="myApp.UserController">
,因为您可以在属性ng-app:<body ng-app="myApp">
中定义myApp。这样,您就可以调用ng控制器,而无需每次都在myApp前加前缀。
定义控制器最干净的方法是每个文件1个。每个文件都应该包装一个立即调用的函数表达式(IIFE)或闭包,使其能够在不污染全局范围的情况下拥有自己的局部变量。这是我在项目中采用的方法:
my-app.js-主模块定义文件-该文件的主要目的是定义应用程序模块及其依赖项,定义路由(如果正在使用路由),并配置提供程序。最简单的形式是这样的:
(function (angular) {
angular.module('myApp', ['myApp.someFeature']);
}(angular));
somefeature/some-feature.js-功能模块定义文件-该文件定义功能的模块以及该功能所需的任何依赖项。这可以是任何逻辑分组,而不仅仅是一个功能。这使得在必要时可以很容易地将该功能引入另一个模块或应用程序。
(function (angular) {
angular.module('myApp.someFeature', []);
}(angular));
some feature/some-feature-controller.js-该功能所需的控制器-如果该功能包括多个控制器,则需要一个更具描述性的名称,但假设该功能只需要一个控制器。
(function (angular) {
function SomeFeatureController($scope) {
...
}
angular
.module('myApp.someFeature')
.controller('SomeFeatureController', SomeFeatureController);
}(angular));
index.html-页面html文件-非常不言自明的
<html ng-app="myApp">
<head>
<title>My Angular App</title>
<!-- Note: Angular and jQuery (if used) go in head so they delay view loading -->
<script type="text/javascript" language="javascript" src="angular.js"></script>
</head>
<body ng-controller="SomeFeatureController">
Content here....
<!-- Note application files go at the end of the body so they do not delay view loading -->
<script type="text/javascript language="javascript src="my-app.js">
<script type="text/javascript language="javascript src="some-feature/some-feature.js">
<script type="text/javascript language="javascript src="some-feature/some-feature-controller.js">
</body>
</html>
根据btesser的建议,在单独的文件和函数中编写控制器并在控制器的函数原型中定义其方法是AngularJS应用程序的最佳实践。您可以使用闭包或IIFE来防止污染全局命名空间,它将只向当前上下文公开您的函数。
(function(){
'use strict';
angular.module('myApp', [])
.controller('MyAppCtrl', MyAppCtrl)
;
function MyAppCtrl(){
this.greeting = 'I''m app ctrl';
}
MyAppCtrl.prototype.hello = function(){
alert(this.greeting);
}
})();
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp">
<div ng-controller="MyAppCtrl as ctrl">
<pre>{{ctrl | json}}</pre>
<button ng-click="ctrl.hello()">Hello!</button>
</div>
</body>
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- AngularJS:我可以跳过函数参数回调吗
- AngularJS UI路由器不能像ng路由器那样工作
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 如何包含特定于每个视图angularjs的javascript文件
- AngularJS:ng之后,重复$scope值未按预期更新
- AngularJS-在JSON选择器中使用变量名
- $window.ga在AngularJS事件中未定义
- AngularJS-使用'true'属性
- 打开一个模态并将其链接到AngularJS中的指令
- Angularjs代码未在匿名函数中运行
- angularjs+rails应用程序中未显示模板
- 我的AngularJS表达式没有'不起作用
- AngularJS JSON not arriving php
- 使用AngularJS中的筛选器更新给定的表
- Angularjs工厂注入错误
- AngularJS设计指南
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- 使用angularjs验证文本框中的电子邮件
- angularjs不会污染全球