基本概念
在使用AngularJS之前,我们有必要梳理一下AngularJS核心概念及实现原理,以便于写出结构良好的代码。本章我们将结合简单的实例简要介绍Angular的重点概念,我们将附上AngularJS官方文档上的原文,帮助大家更好的理解概念:
- Template
官方解释 “HTML with additional markup” ,模板就是HTML和CSS编写的片段,用来展现应用的视图。您可以通过实现AngularJS编译器识别的指令(directive), 扩展HTML的标签或属性。 - Directives
官方解释"extend HTML with custom attributes and elements", 指令即通过AngularJS定制化的HTML标签或属性 - Model
官方解释"the data shown to the user in the view and with which the user interacts", 熟悉MVC框架的人都知道Model就是数据,AngularJS通过作用域(scope)保持数据模型与视图的双向同步。如果一方改变,另一方会自动随之更新状态。 模型中的数据一般为Javascript的对象,数组或基本类型。 - Scope
官方解释"context where the model is stored so that controllers, directives and expressions can access it", 及Model的作用域或上下文,控制器(Controllers)、指令(Directives)、表达式(Expression)只能访问相应作用域内的Model, 除非是通过Angular底层API访问其他作用域。作用域是分层组织的,层级关系与DOM结构是绑定(除了特定的指令会自建Scope) - Expressions
官方解释"access variables and functions from the scope", 通过AngularJS表达式可以访问作用域内的变量或函数。 - Compiler
官方解释"parses the template and instantiates directives and expressions",编译器,AngularJS在页面加载完DOM之后会对HTML预处理,编译器负责解析模板(template)和初始化指令和表达式。 - Filter
官方解释"formats the value of an expression for display to the user", 过滤器, AngularJS提供了内建的过滤器或自定义的过滤器对表达式的内容进行格式化输出。 - View
官方解释"what the user sees (the DOM)",即视图。 - Data Binding
官方解释"sync data between the model and the view", AngularJS通过双向数据绑定,同步模型与视图。 - Controller
官方解释"the business logic behind views",控制器封装了业务逻辑。 - Dependency Injection
官方解释"Creates and wires objects and functions",依赖注入,类似于Spring, AngularJS会将对象缓存与注入器内部($injector), 通过名字查找对象实例,如果没有找到会根据相关的工厂创建实例,自动加载依赖的组件,让代码更简洁清晰。 - Injector
官方解释"dependency injection container", 即注入器,类似于Spring容器,AngularJS为每个应用(ng-app)提供唯一的注入器,用于缓存对象实例。 - Module
官方解释"a container for the different parts of an app including controllers, services, filters, directives which configures the Injector", 模块,AngularJS可以让我们写出高内聚性的app,通过相关的控制器,服务,指令组织在模块中,每个模块都有相应的唯一的注入器,管理配置模块的内部组件。
实例讲解
接下来我们通过具体的实例讲解上面涉及的概念。
实例1: 数据绑定
<div ng-app ng-init="qty=1;cost=2"> <b>Invoice:</b> <div> Quantity: <input type="number" min="0" ng-model="qty"> </div> <div> Costs: <input type="number" min="0" ng-model="cost"> </div> <div> <b>Total:</b> {{qty * cost | currency}} </div> </div>
页面预览:
让我们具体看上面的例子:
- AngularJS把上面的一段HTML看作一个"Template", 在HTML加载完成后,Angular从ng-app处启动应用,由Angular编译器"Compiler"解析新的标签或者属性,初始化Angular应用的上下文,绑定模型和视图。通过此过程加载、转换并展现出来的DOM就是所谓的视图。
- 新的标记被称为指令"Directive",这种标记通过AngularJS被赋予了某些特殊行为。例如 "ng-app"触发Angular自动初始化相应的应用模块, 如下图所示:
- Angular内建了指令给<input>添加了额外的行为。
- ng-model指令绑定了作用域内同名的属性,在这个例子中input中的text发生改变,绑定的model(qty | cost)值也随之更新, 反之亦然。
- {{ expression | filter }} AngularJS会这类标记识别成表达式和过滤器,表达式类似于JS片段,允许我们 读写作用域内的模型(model),如例子所示,我们通过表示可以看到input的中绑定的变量的乘积。
- 上述表达式还有个filter,用于前面的表达式结果进行格式化输出, 用法类似于Linux里面的管道"|".
该例子展示了AngularJS的双向数据绑定. 当input值改变时,会重新计算表达式并在DOM中实时更新。
实例二: 基于实例1 通过Controller加入逻辑
实现Controller (invoice.js)
angular.module('invoice', []) .controller('InvoiceController', function() { this.qty = 1; this.cost = 2; this.inCurr = 'EUR'; this.currencies = ['USD', 'EUR', 'CNY']; this.usdToForeignRates = { USD: 1, EUR: 0.74, CNY: 6.09 }; this.total = function total(outCurr) { return this.convertCurrency(this.qty * this.cost, this.inCurr, outCurr); }; this.convertCurrency = function convertCurrency(amount, inCurr, outCurr) { return amount * this.usdToForeignRates[outCurr] / this.usdToForeignRates[inCurr]; }; this.pay = function pay() { window.alert("Thanks!"); }; });
HTML
<div ng-app="invoice" ng-controller="InvoiceController as invoice"> <b>Invoice:</b> <div> Quantity: <input type="number" min="0" ng-model="invoice.qty" required > </div> <div> Costs: <input type="number" min="0" ng-model="invoice.cost" required > <select ng-model="invoice.inCurr"> <option ng-repeat="c in invoice.currencies">{{c}}</option> </select> </div> <div> <b>Total:</b> <span ng-repeat="c in invoice.currencies"> {{invoice.total(c) | currency:c}} </span> <button class="btn" ng-click="invoice.pay()">Pay</button> </div> </div>
实例讲解:
- 在这个例子中我们我们实现了名为"invoice1"的应用模块名在页面中通过ng-app指令引入. 在"invoice1"模块中定义了"InvoiceController"控制器,并通过ng-controller在页面中绑定, 注意ng-controller必须出现在和"invoice1"绑定的元素或者子元素中. 控制器暴露了该模块作用域内可以使用的变量或者函数(this.*)给相应的表达式和指令.
- Angular提供controller()构造器给我们实现自己的Controller.
- 在ng-controller我们用“InvoiceController as invoice” 给controller去了个别名,通知AngularJS在注入器给该控制器的实例取名为invoide,在HTML子元素中可以通过别名引用控制器里面的变量或者函数。
- 我们同样注意到ng-repeat指令,可定绑定数组或者对象类型,迭代DOM操作
- ng-click是另外一个AngularJS指令,在相应DOM上绑定click时间及与之对应的行为。
工作原理如下图所示:
实例三 : 基于实例二将于View无关的业务逻辑抽取到service组件里面
但应用变得愈加复杂的时候有必要把与视图无关的业务逻辑抽取成service组件,有经验的程序员可以联想JAVA EE或者.NET中的MVC架构。这些service是可以重用的。让我们重构一下上面的代码:
1. 将finance领域相关的逻辑抽取成finance.js
angular.module('finance', []) .factory('currencyConverter', function() { var currencies = ['USD', 'EUR', 'CNY']; var usdToForeignRates = { USD: 1, EUR: 0.74, CNY: 6.09 }; var convert = function (amount, inCurr, outCurr) { return amount * usdToForeignRates[outCurr] / usdToForeignRates[inCurr]; }; return { currencies: currencies, convert: convert }; });
2. 简化invoice.js的代码如下:
angular.module('invoice', ['finance']) .controller('InvoiceController', ['currencyConverter', function(currencyConverter) { this.qty = 1; this.cost = 2; this.inCurr = 'EUR'; this.currencies = currencyConverter.currencies; this.total = function total(outCurr) { return currencyConverter.convert(this.qty * this.cost, this.inCurr, outCurr); }; this.pay = function pay() { window.alert("Thanks!"); }; }]);
我们分析一下重构的代码:
1. 我们把convertCurrency函数挪到了finance.js中,利用依赖注入机制在controller的构造函数中声明注入finance service对象。Angular组件都可以通过依赖注入的方式(injector)连接起来。
2. 提到依赖注入,我们肯定想到一定会有个地方(容器)注册、存放、管理依赖,AngularJS通过模块(module)把相关的组件放到一起。在Angular启动应用时,会通过ng-app的配置项,已经定义在module代码里面的配置项初始化容器。
3. 在上面的例子中ng-app="invoice"这个指令告诉Angular用invoice模块作为应用的主模块。代码angular.module('invoice', ['finance'])声明invoice模块依赖finance模块,即InvoiceController中用到了finance模块中的currencyConverter服务controller('InvoiceController', ['currencyConverter',function....]。
4. AngularJS提供了多种方式声明依赖,本例通过构造函数的参数列表中定义依赖,最后一个参数为构造函数。
5. 本例中通过AngularJS的factory方法定义service, 例如factory('currencyConverter', function(){...}, 在后续的例子中我们将会详解service.
本例具体原理如下图所示:
以上示例来自于官方文档,在后续的章节中我们将结合更多具体的代码示例详解每个具体的概念。
相关推荐
NULL 博文链接:https://boyitech.iteye.com/blog/2167272
3. **纳什均衡**:纳什均衡是博弈论中的核心概念,由约翰·纳什提出。在一个博弈中,如果每个玩家选择的策略都是对其他玩家策略的最优反应,那么这个状态就构成了纳什均衡。 4. **最小最大定理**:在两个玩家的零和...
#### 二、博弈论核心概念 1. **纳什均衡**:纳什均衡是指在给定其他参与者策略不变的情况下,任何参与者都无法通过改变自己的策略来获得更好的结果。这种策略组合由所有参与者最优策略组成,一旦形成,没有任何参与...
论文研究-不确定性下多目标博弈中弱Pareto-NS均衡的存在性.pdf, 在已知不确定参数变化范围的假设下, 研究了多目标博弈中弱Pareto-NS均衡点的存在性问题. 首先结合非合作...
2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
首先,我们要理解博弈论的核心概念——“博弈”(Game),它并非仅仅局限于游戏,而是涵盖了所有具有明确规则和参与者之间存在利益冲突或合作的情况。博弈包括两个关键元素:参与者(Players)和策略(Strategies)...
博弈论的发展历程中,包括冯·诺伊曼和摩根斯坦的合作,纳什的非合作博弈理论,以及泽尔腾和海萨尼对动态博弈和不完全信息的研究,这些都是现代博弈论的核心概念。 信息经济学则关注信息不对称问题,特别是在委托-...
完全信息静态博弈中的核心概念是纳什均衡,由约翰·纳什提出,它描述了在一个博弈中,当所有参与者都无法通过改变自己的策略来提高收益时的状态。在完全信息动态博弈中,子博弈精炼纳什均衡的概念引入,它考虑了参与...
纳什均衡是这种博弈中的核心概念,它指出了在一个策略组合中,每个参与者无法单方面改变策略以提高自己的收益,即使其他参与者保持不变。例如,在经典的囚徒困境中,两个囚犯面临是否坦白的选择,形成了一个纳什均衡...
这些概念都是博弈论的核心内容,都是研究博弈的结果或结局的重要工具。 计算博弈第二讲-V61 是一门专业的课程,旨在让学生理解博弈的基本概念、方法和应用。通过学习这门课程,学生可以更好地理解博弈论的原理和...
2019年2季度大类资产配置报告:从基本面博弈转向资金面博弈-华泰证券-20190424.pdf
微观经济学讲义-第13章博弈论
本讲义主要涵盖了非合作博弈理论和信息经济学的核心概念。 首先,非合作博弈理论是博弈论的基础,它描述了两个或多个独立决策者之间的互动,这些决策者无法通过正式协议来协调行动。在完全信息静态博弈中,所有参与...
2. 多目标交互、协同、决策的UWSNs拓扑控制优化问题:该问题是将节点之间和节点与环境之间的交互、协同、决策过程映射成一个多目标优化问题,以便于更好地解决UWSNs中的网络拓扑控制问题。 3. 势博弈与Log-linear...
纳什均衡是博弈论的核心概念之一,它对经济学、政治学、社会学等领域都产生了深远的影响。 文中首先介绍了一个投票博弈的例子,三个参与人1、2、3需要通过投票方式决定采用哪个方案。如果没有方案能获得多数,则...
纳什均衡是这一领域的核心概念,由约翰·纳什提出,指在所有参与者的策略组合中,没有任何单个参与者可以通过改变自己的策略来提高其收益,前提是其他参与者的策略不变。纳什均衡揭示了在没有合作情况下,参与者可能...
在本讲义中,我们将探讨非合作博弈理论和信息经济学的相关概念。 首先,非合作博弈理论是博弈论的核心,主要关注参与者在没有共同利益或协议约束下的决策过程。在完全信息静态博弈中,所有参与者都掌握所有相关信息...
七所大学的博弈论讲义,包括哈佛大学.卡内基梅隆大学.芝加哥大学.加利福尼亚大学(圣. 迭戈校区).加利福尼亚
人机博弈。PDF中文版。。。。。。。。。。。。。。。。。。。。。。。。。