AngularJS学习篇(二十二)
AngularJS 依赖注入
什么是依赖注入
wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。
该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦合,并遵循了依赖反转和单一职责原则。与服务定位器模式形成直接对比的是,它允许客户端了解客户端如何使用该系统找到依赖
一句话 --- 没事你不要来找我,有事我会去找你。
AngularJS 提供很好的依赖注入机制。以下5个核心组件用来作为依赖注入:
- value
- factory
- service
- provider
- constant
value
Value 是一个简单的 javascript 对象,用于向控制器传递值(配置阶段):
- // 定义一个模块
- var mainApp = angular.module("mainApp", []);
- // 创建 value 对象 "defaultInput" 并传递数据
- mainApp.value("defaultInput", 5);
- ...
- // 将 "defaultInput" 注入到控制器
- mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
- $scope.number = defaultInput;
- $scope.result = CalcService.square($scope.number);
- $scope.square = function() {
- $scope.result = CalcService.square($scope.number);
- }
- });
factory
factory 是一个函数,用于返回值。在 service 和 controller 需要时创建。
通常我们使用 factory 函数来计算或返回值。
- // 定义一个模块
- var mainApp = angular.module("mainApp", []);
- // 创建 factory "MathService" 用于两数的乘积 provides a method multiply to return multiplication of two numbers
- mainApp.factory('MathService', function() {
- var factory = {};
- factory.multiply = function(a, b) {
- return a * b
- }
- return factory;
- });
- // 在 service 中注入 factory "MathService"
- mainApp.service('CalcService', function(MathService){
- this.square = function(a) {
- return MathService.multiply(a,a);
- }
- });
provider
AngularJS 中通过 provider 创建一个 service、factory等(配置阶段)。
Provider 中提供了一个 factory 方法 get(),它用于返回 value/service/factory。
- // 定义一个模块
- var mainApp = angular.module("mainApp", []);
- ...
- // 使用 provider 创建 service 定义一个方法用于计算两数乘积
- mainApp.config(function($provide) {
- $provide.provider('MathService', function() {
- this.$get = function() {
- var factory = {};
- factory.multiply = function(a, b) {
- return a * b;
- }
- return factory;
- };
- });
- });
constant
constant(常量)用来在配置阶段传递数值,注意这个常量在配置阶段是不可用的。
- mainApp.constant("configParam", "constant value");
实例
以下实例提供了以上几个依赖注入机制的演示。
- <html>
- <head>
- <meta charset="utf-8">
- <title>AngularJS 依赖注入</title>
- </head>
- <body>
- <h2>AngularJS 简单应用</h2>
- <div ng-app = "mainApp" ng-controller = "CalcController">
- <p>输入一个数字: <input type = "number" ng-model = "number" /></p>
- <button ng-click = "square()">X<sup>2</sup></button>
- <p>结果: {{result}}</p>
- </div>
- <script type="text/javascript" src="angular-1.4.6.js" charset="utf-8"></script>
- <script>
- var mainApp = angular.module("mainApp", []);
- mainApp.config(function($provide) {
- $provide.provider('MathService', function() {
- this.$get = function() {
- var factory = {};
- factory.multiply = function(a, b) {
- return a * b;
- }
- return factory;
- };
- });
- });
- mainApp.value("defaultInput", 5);
- mainApp.factory('MathService', function() {
- var factory = {};
- factory.multiply = function(a, b) {
- return a * b;
- }
- return factory;
- });
- mainApp.service('CalcService', function(MathService){
- this.square = function(a) {
- return MathService.multiply(a,a);
- }
- });
- mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
- $scope.number = defaultInput;
- $scope.result = CalcService.square($scope.number);
- $scope.square = function() {
- $scope.result = CalcService.square($scope.number);
- }
- });
- </script>
- </body>
- </html>
AngularJS学习篇(二十二)的更多相关文章
- AngularJS学习篇(十二)
AngularJS SQL ASP.NET 中执行 SQL 获取数据 <!DOCTYPE html> <html> <head> <meta charset= ...
- Scrapy学习篇(十二)之设置随机IP代理(IPProxy)
当我们需要大量的爬取网站信息时,除了切换User-Agent之外,另外一个重要的方式就是设置IP代理,以防止我们的爬虫被拒绝,下面我们就来演示scrapy如何设置随机IPProxy. 设置随机IPPr ...
- Redis学习篇(十二)之管道技术
通过管道技术降低往返时延 当后一条命令不依赖于前一条命令的返回结果时,可以使用管道技术将多条命令一起 发送给redis服务器,服务器执行结束之后,一起返回结果,降低了通信频度.
- AngularJS学习篇(十九)
AngularJS Bootstrap 可以在你的 AngularJS 应用中加入 Twitter Bootstrap,你可以在你的 <head>元素中添加如下代码: <link r ...
- AngularJS学习篇(十八)
AngularJS API AngularJS 全局 API 用于执行常见任务的 JavaScript 函数集合,如: 比较对象 迭代对象 转换对象 全局 API 函数使用 angular 对象进行访 ...
- AngularJS学习篇(十六)
AngularJS 表单 HTML 控件 以下 HTML input 元素被称为 HTML 控件: input 元素 select 元素 button 元素 textarea 元素 HTML 表单 H ...
- AngularJS学习篇(十五)
AngularJS 模块 模块定义了一个应用程序. 模块是应用程序中不同部分的容器. 模块是应用控制器的容器. 控制器通常属于一个模块. 创建模块 你可以通过 AngularJS 的 angular. ...
- AngularJS学习篇(十四)
AngularJS 事件 ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. <!DOCTYPE html> <html> <head& ...
- AngularJS学习篇(十)
AngularJS Select(选择框) 使用 ng-options 创建选择框 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如 ...
- 我的MYSQL学习心得(十二) 触发器
我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...
随机推荐
- SQL语言知识点总结
1.DQL.DML.DDL.DCL的概念与区别 一.SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下: 1974年- ...
- Linux脚本入门(1)
1. Linux 脚本编写基础1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例 ...
- struts jar包
这些错误很让我摸不着头脑,经多方查阅资料后,在Struts 2.2.x中应该导入如下7个JAR文件 1) commons-fileupload-1.2.1.jar 2) commons-io- ...
- Hadoop 一: NCDC 数据准备
Hadoop 本文介绍Hadoop- The Definitive Guide一书中的NCDC数据准备,为后面的学习构建大数据环境; 环境 3节点 Hadoop 2.7.3 集群; java vers ...
- Codeforces Round #430 (Div. 2)
A. Kirill And The Game time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Python s12 Day1 笔记及作业
作业一: 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 python3代码 : # -*- coding:utf-8 -*- input_name = input("Please ...
- 邮件实现详解(二)------手工体验smtp和pop3协议
上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍.我们知道电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递必须 ...
- 关于Websockets问题:
Websockets是一种与服务器进行全双工,双向通信的信道,它不使用http协议,他有自己的协议即自定义协议,ws协议:它的安全协议为wss协议.这种协议专门为快速传输小数据而设计的.对服务其有一 ...
- 聊聊VUE中的nextTick
在谈nextTick之前,先要说明一件事,可能在我们平时使用vue时并没有关注到,事实上,vue执行的DOM更新是异步的. 举个栗子: <template> <div class=& ...
- webpack-dev-server配置指南(使用webpack3.0)
最近正在研究webpack,听说webpack可以自己搭建一个小型的服务器(使用过vue-cli的朋友应该都见识到过),所以迫不及待的想要尝试一下.不过,在实际操作中发现,用webpack搭建服务器仍 ...