在Angular中,控制器(Controller)就是基于JavaScript的构造方法,主要用来构造模型并建立模型和视图之间的数据绑定。控制器里面定义了应用程序的逻辑和行为。
通过ng-controller指令可以将控制器和DOM绑定起来。Angular会用定义过的控制器构造函数实例化一个控制器对象,在Angular应用(module)启动的时候,会创建一个根作用域, Angular实例化每个控制器时会创建一个新的子作用域并作为可注入参数($scope)注入到控制器的构造方法中.
在理解控制器作用的基础上,我们应当按照约定使用控制器:
1. 初始化$scope.
2. 在$scope中增加应用的行为。
尽量避免在如下场景中使用控制器:
1.操作DOM - 控制器主要包含业务逻辑。 把视图逻辑放到控制器中会严重影响代码的可测试性。Angular已经将绝大部分侦听器和DOM操作逻辑加以封装在数据绑定和指令(directives)中。
2. 格式化输入 - 尽量用angular form controls取代。
3. 格式化或者过滤输出 - 考虑使用Angular的过滤器(filters).
4. 实现共享代码片段,或者管理多个控制器之间的状态 - 考虑使用service组件来管理
5. 管理其他组件的生命周期(例如创建service组件实例)
初始化$scope对象的状态
但创建一个应用时,我们通常需要通过设置$scope的属性来初始化Angular $scope的状态。 这些属性(properties)包含了视图模型。$scope的属性在控制器所绑定的DOM范围内的模板(template)是可见的。
例如:
var myApp = angular.module('myApp',[]); myApp.controller('GreetingController', ['$scope', function($scope) { $scope.greeting = 'Hola!'; }]);
这里创建了一个'myApp'的应用模块,并定义了‘GreetingController’控制器,接下来我们通过ng-controller指令将控制器绑定到相应的div上:
<div ng-controller="GreetingController"> {{ greeting }} </div>
这样我们就可以通过{{greeting}}表达式得到greeting属性的值。
给Scope对象赋予行为
我们可以给scope对象添加方法,这样就可以在绑定的视图或者模板中调用这些方法来响应事件或者执行一些计算任务. 让我们看下面的例子:
var myApp = angular.module('myApp',[]); myApp.controller('DoubleController', ['$scope', function($scope) { $scope.double = function(value) { return value * 2; }; }]);
这段JS代码中,我们给scope添加了double方法,然后我们将控制器添加到DOM中:
<div ng-controller="DoubleController"> Two times <input ng-model="num"> equals {{ double(num) }} </div>
这样我们就可通过表达式调用scope的double方法。正如我们在基本概念一节中讲述的, 定义在scope中的属性可以作为模型数据被绑定,同时定义在scope中的方法也可以被表达式或者ng事件指令调用,例如ngClick.
正确使用控制器
简言之,控制器中一般只包含视图相关的业务逻辑. 我们可以和视图无关的代码及公用代码封装在service中,通过在构造器中注入依赖的方式来使用services. 我们将会在稍后的章节中详解依赖注入机制.
关联控制器和Scope对象
我们可以通过ngController指令和$route service来关联控制器和Scope对象.
接下来我们通过代码范例帮助大家更好地理解Angular控制器的工作原理。我们将创建一个简单的app包含三个部分:
1. 一个模板(template) 包含了一个消息和两个按钮。
2. 一个模型(Model)包含一个名叫spice的属性。
3. 一个控制器包含了两个方法设置spice的值。
template code (index.html)
<div ng-controller="SpicyController"> <button ng-click="chiliSpicy()">Chili</button> <button ng-click="jalapenoSpicy()">Jalapeño</button> <p>The food is {{spice}} spicy!</p> </div>
app.js(定义了控制器)
var myApp = angular.module('spicyApp1', []); myApp.controller('SpicyController', ['$scope', function($scope) { $scope.spice = 'very'; $scope.chiliSpicy = function() { $scope.spice = 'chili'; }; $scope.jalapenoSpicy = function() { $scope.spice = 'jalapeño'; }; }]);
我们可以看到,模板中的消息通过表达式绑定到spice属性,spice被初始化为"very", 随后我们有通过ng-click绑定了scope中的两个方法,分别修改了spice的值, 但我们点击按钮时,消息会被自动刷新。
初始化页面:
点击Chili后, 消息自动更新:
让我们总结一下以上实例:
1. Angular通过ng-controller隐式的给模板创建了一个作用域(scope),这个作用域被SpicyController扩充。
2. SpicyController是一个普通的JavaScript函数。通常Controller名字首字母大写,以Controller为后缀。
3. 通过给$scope里面的属性赋值来创建或者更新模型。
4. Controller的方法可以直接定义为$scope的方法。
5. 可以在与控制器关联的<div>以及子元素中通过模板中的表达式以及ng事件指令访问控制器的方法和属性。
实例 二:为控制器方法添加参数, 参数可以引用model
<div ng-controller="SpicyController"> <input ng-model="customSpice"> <button ng-click="spicy('chili')">Chili</button> <button ng-click="spicy(customSpice)">Custom spice</button> <p>The food is {{spice}} spicy!</p> </div>
var myApp = angular.module('spicyApp2', []); myApp.controller('SpicyController', ['$scope', function($scope) { $scope.customSpice = "wasabi"; $scope.spice = 'very'; $scope.spicy = function(spice) { $scope.spice = spice; }; }]);
在这个例子中我们注意到ng-click绑定的方法中添加了参数, 参数为模型spice的值, 同时输入文本框也绑定到spice属性,但在输入文本框里面键入spice的值,点击‘Custom Spice’ 按钮, message中spiced的值会被替换成文本框中的值。
实例三: 作用域的继承关系
我们可以把控制器关联到不同的DOM层级。由于ng-controller指令会自动创建子作用域,所以作用域也有相应的层级关系。子作用域中可访问上级作用域中的属性和方法,上级作用域的同名属性和方法将被子作用域隐藏。 让我们结合代码来理解:
index.html
<div class="spicy"> <div ng-controller="MainController"> <p>Good {{timeOfDay}}, {{name}}!</p> <div ng-controller="ChildController"> <p>Good {{timeOfDay}}, {{name}}!</p> <div ng-controller="GrandChildController"> <p>Good {{timeOfDay}}, {{name}}!</p> </div> </div> </div> </div>
app.css
div.spicy div { padding: 10px; border: solid 2px blue; }
app.js
var myApp = angular.module('scopeInheritance', []); myApp.controller('MainController', ['$scope', function($scope) { $scope.timeOfDay = 'morning'; $scope.name = 'Nikki'; }]); myApp.controller('ChildController', ['$scope', function($scope) { $scope.name = 'Mattie'; }]); myApp.controller('GrandChildController', ['$scope', function($scope) { $scope.timeOfDay = 'evening'; $scope.name = 'Gingerbread Baby'; }]);
运行结果:
我们注意到这里我们实现了三个控制器: MainController, ChildController, GrandChildController,并在不同级的div中被关联,Angular将产生四个作用域:
1. root scope即根作用域
2. MainController的作用域, 包括了timeOfDay和name属性。
3. ChildController的作用域, 继承了MainController的timeOfDay属性,覆盖了MainController的name属性。
4. GrandChildController的作用域,分别从MainController作用域继承了timeOfDay属性, 覆盖了上一层作用域的name属性。
作用域中的方法原理同上, 这里就不一一详解。
相关推荐
NULL 博文链接:https://boyitech.iteye.com/blog/2167272
4. **最小最大定理**:在两个玩家的零和博弈中,每个玩家都应选择一个策略,使得对方能获得的最大收益最小。这是约翰·冯·诺伊曼提出的理论。 5. **扩展形式博弈**:用于描述具有多个阶段或步骤的博弈,每一步玩家...
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码...4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
论文研究-不确定性下多目标博弈中弱Pareto-NS均衡的存在性.pdf, 在已知不确定参数变化范围的假设下, 研究了多目标博弈中弱Pareto-NS均衡点的存在性问题. 首先结合非合作...
### 博弈论专题知识点详解 #### 一、博弈论概览 博弈论,又称对策论,是现代数学的一个重要分支,主要研究在各种策略情况下,参与者如何做出决策以达到自身利益最大化。这一理论不仅在数学领域有广泛的应用,同时...
哈佛大学的博弈论讲义是这个领域的权威资料之一,深受学者和学生们的喜爱。本讲义深入浅出地介绍了博弈论的基本概念、理论与应用,帮助读者理解在竞争与合作中的决策制定。 首先,我们要理解博弈论的核心概念——...
4. 非齐次马尔可夫链理论:该理论用于证明网络拓扑控制目标函数的优化问题收敛到最大化势博弈函数的解。 该算法的优点在于可以解决UWSNs中的网络拓扑控制问题,提高网络的生存周期和稳定性,并且可以应用于其他领域...
例如,在智猪博弈中,大猪和小猪如何决定是否启动食物分配器,形成了一个动态的决策过程,最终得出大猪按按钮,小猪等待的子博弈精炼纳什均衡。 然后,讲义探讨了不完全信息静态博弈和动态博弈。在这些博弈中,参与...
微观经济学讲义-第13章博弈论
博弈论是一种分析决策者之间互动行为的数学工具,尤其在经济学、政治学、社会学等领域有着广泛的应用。在本章中,我们主要探讨的是重复博弈,这是博弈论的一个重要分支,它研究的是相同结构的博弈在一段时间内重复...
本讲义主要涵盖了非合作博弈理论和信息经济学的核心概念。 首先,非合作博弈理论是博弈论的基础,它描述了两个或多个独立决策者之间的互动,这些决策者无法通过正式协议来协调行动。在完全信息静态博弈中,所有参与...
4. **不完全信息动态博弈** - 进一步扩展到动态博弈,我们将探索精炼贝叶斯纳什均衡,这涉及到参与者如何在信息逐渐揭示的过程中调整策略。 博弈论的发展历程中,包括冯·诺伊曼和摩根斯坦的合作,纳什的非合作博弈...
七所大学的博弈论讲义,包括哈佛大学.卡内基梅隆大学.芝加哥大学.加利福尼亚大学(圣. 迭戈校区).加利福尼亚
讲义第三章详细讲解了子博弈精炼纳什均衡,这是一种动态博弈的解概念,要求均衡策略不仅要在初始阶段是最佳的,而且在任何可能的子博弈中也必须是最优的。以房地产开发项目的例子来说明,开发商A和B在面对不确定市场...
计算博弈第二讲-V61 计算博弈是自动化研究所 University of Chinese of Academy of Sciences 的一门专业普及课,旨在让学生理解博弈的基本概念、方法和应用。第二讲的主要内容是博弈表示方法、常见博弈类型和博弈的...
2019年2季度大类资产配置报告:从基本面博弈转向资金面博弈-华泰证券-20190424.pdf
人机博弈。PDF中文版。。。。。。。。。。。。。。。。。。。。。。。。。
4. **重复剔除的占优均衡**:在博弈过程中,如果一个策略对所有对手的策略都是劣势策略,那么可以剔除这个策略。反复剔除后,最终剩下的均衡就是重复剔除的占优均衡。 5. **委托-代理理论**:这是信息经济学的重要...
博弈是什么意思-博弈之道须正矣.docx