使用AngularJS编写较为优美的JavaScript代码指南(3)

在我们第一个示例中,我们的问题是并没有保存一个指向我们匿名函数的引用,所以我们永远也不能再获取到isDoingWork这个值。这就是我们下一个示例要改进的地方.

函数是一个对象 : 使用this

因为每一个函数都是一个对象,所以每个函数都会有一个this变量,这个变量向开发者提供了指向当前对象的引用. 为了提供在从外部大我们的函数及其范围的访问,我们可以返回这个this变量 -- 而它将会提供一个指向当前对象的引用.

然后,除非我们将这个私有的isDoingWork变量添加到函数引用(this)上,我们也不能够引用这个变量。为此我们要对之前的示例做一下轻微的改动。它看起来会像下面这样:
 

thing = (function(){ // 1. this.isDoingWork = false; // 2. console.log("isDoingWork value : " + isDoingWork); return this; // 3. }());

你可以看到第一行我们加入了一个新的全局变量thing,它包含了从匿名函数返回的值。从示例代码的开头跳到第三行,你可以看到我们返回了this变量。那就意味着我们返回了一个指向匿名函数的引用.

在第二行我们也已经将isDoingWork加入了this引用中,那样我们就可以使用语法thing.isDoingWork来从外部引用到这个值了.
自己动手看看

为了看看的运行,你可以做下面这几步:

    下载本文的示例代码.

    在你的浏览器中打开 modulePattern4.htm.

    打开浏览器开发工具 -- F12(Chrome, IE) 或者 Ctrl-Shift-I (Opera) -- (那样你就可以看到控制台了)

    你将会看到isDoingWork的值会输出到控制台,就像最开始那个示例中你看到的那样.

    不过,现在你得输入thing.isDoingWork才能或者这个值.


模块模式总结

在最后这个示例中,变量值被成功的封装了,而其他的JavaScript库则可以明确的引用thing对象来获取这个值.  好像不大可能,而这帮助了我们保持全局命名空间的干净,并且在看起看来是更好的代码组织形式. 这也使得我们代码的维护更容易.
最终,我们用上了 AngularJS

因为使用模块模式是一个最佳实践,AngularJS的开发者就将一个模块系统构建到了库中.
Plunker 代码

首先你可以通过到这个Plunker上 (?p=preview - 在一个新的窗口或Tab页打开)获取整个AngularJS示例.

而我们在这里展示出代码,那样我们就可以更方便的谈论它了.

首先,让我们看看这个 HTML. 


<!DOCTYPE html> <html ng-app="mainApp"> <head> <meta charset="utf-8" /> <title>Angular Module Example</title> <script data-require="angular.js@1.2.x" src="https://code.angularjs.org/1.2.20/angular.js" data-semver="1.2.20"></script> <script src="https://www.jb51.net/mainCtrl.js"></script> <script src="https://www.jb51.net/secondCtrl.js"></script> </head> <body> <div ng-controller="MainCtrl as mc"> <p>mc refers to MainCtrl which has been added to the angular app module</p> <p>Hello {{mc.name}}!</p> <ol><li ng-repeat="a in mc.allThings">{{a}}</li></ol> </div> <div ng-controller="SecondCtrl as sc"> <p> Hello {{sc.name}} </p> <ol><li ng-repeat="a in sc.allThings">{{a}}</li></ol> </div> </body> </html>

Angular 指令 : ng-app

Angular 所定义和使用的东西叫做指令。这些指令基本上就是由Angular定义属性,而AngularJS编译器(Angular的JavaScript)会将它们转换成其他的东西.

我们应用了ng-app指令,为我们的Angular应用定义了一个名称,叫做mainApp.

mainApp 就是我们稍后会看到的模块模式的起点. 
被引入的脚本 : 每个都是一个模块

现在,请注意有三个脚本被引入到了这个HTML中.

第一个是必须的AngularJS库.

而其他两个则是作为模块被实现的Angular控制器.

它们被作为模块实现以保持代码彼此,还有从这个应用上看,都是独立的.

AngularJS : 创建 score

在往下看,你将会看到两个以如下代码开头的div:
 

<div ng-controller="MainCtrl as mc"> <div ng-controller="SecondCtrl as sc">

这是在为div的每一个都设置上ng-controller.  这些div中的每一个都有其各自的范围.  第一个控制器的名字叫做 MainCtrl,第二个叫做 SecondCtrl.

AngularJS 编译器会在你提供(引入)的代码中用这两个名称查找对应的函数.

如果AngularJS编译器没有找个这两个名称对应的函数,它就会抛出一个错误.

mainCtrl.js : 第一个控制器

让我们来看看mainCtrl.js文件里面有些啥东西.

你可以在Plunker页面的左侧点击它在Plunker中将其打开.

当你打开了它,你将会看到一些看上去很熟悉的代码。好吧,你至少会看出来它们都是被包在一个IIFE中的.
 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgdfpx.html