AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。

AngularJS现行主要区分为2个版本系列,分别是AngularJS1.x和AngularJS2,两个版本间的使用上有不少的区别,虽说AngularJS2是对AngularJS1.x的升级和精简,但在资料文档及稳定性上还暂时不如AngularJS1.x,所以我们现在较多的web应用还是用AngularJS1.x开发。从个人了解AngularJS1.x的层次上讲,想要学习AngularJS2,最好还是先从AngularJS1.x开始学习,磨刀不误砍柴工。

AngularJS1.x最大的使用特点就是在标签元素上添加"ng-"指令,通过两个大括号"{{}}"作为表达式,实现对变量的引用及数值显示。本博客的所有代码均使用当前最新版AngularJS v1.6.5版本。下面是一个简单的hello world测试代码,这也是最常见的基础格式:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><script type="text/javascript" src="js/libs/angular/angular.js"></script></head><body><div ng-app="myApp" ng-controller="myCtrl"><input type="text" ng-model="myInput" /></div><script>var app = angular.module("myApp", []);app.controller("myCtrl", function($scope) {$scope.myInput = "hello world";});</script></body></html>

上述例子中,用到了ng-app、ng-controller,这两个指令几乎是每个使用Angular框架页面必备的指令,分别表示对该页面的定义与控制。ng-model表示定义一个变量"myInput"与<input>元素绑定,而在<script>代码块中,,$scope.myInput表示了对变量"myInput"的赋值。最终的页面的显示结果如下:

一. ng-?指令

ng-?指令表示angular框架对元素的操作,我总结了些常用的ng-?指令,供大家可以对指令有一个快速了解过程。至于每个指令的详细使用代码,由于太多这里就不贴出来了,可以留言交流或者百度一下,基本都能找到。

<!--描述:ng-?指令表示angular框架对元素的操作,常见的有如下几种:-----------------------------------------------------------ng-app:定义应用程序的根元素,若不为""时需在js脚本中初始化。ng-bind:把应用程序变量绑定到某个元素的 innerHTML。ng-controller:定义应用的控制器对象,可以控制的服务有$scope,$rootScope,$location,$http,$timeout,$interval,其中$scope.$watch('lastName', function() {)); 可以监控变量的变化ng-model:绑定 HTML 控制器的值到应用数据,即angular变量值,变量值可以是字符串、对象甚至是对象属性。ng-init:定义应用的初始化值,一般为angular变量值。ng-blur:规定 blur 事件的行为。ng-change:规定在内容改变时要执行的表达式。ng-checked:用于设置复选框(checkbox)或单选按钮(radio)的 checked 属性。ng-class:指定 HTML 元素使用的 CSS 类。ng-class-even:类似 ng-class,但只在偶数行起作用,常用table/tr/td、ul/li等元素配合使用ng-class-odd:类似 ng-class,但只在奇数行起作用ng-click:规定click 事件的行为。*ng-cloak:在应用正要加载时防止其闪烁。如<p ng-cloak>{{ 5 + 5 }}</p>ng-copy:用户触发拷贝事件时,规定拷贝事件的行为。ng-cut:用户触发剪切事件时,规定剪切事件的行为。ng-paste:用户触发粘贴事件时,规定粘贴事件的行为ng-dblclick:用户触发双击事件时,规定双击事件的行为。ng-disabled:可设为true|false时,规定一个元素是否被禁用,但不会隐藏。ng-focus:规定focus焦点事件的行为。ng-hide:隐藏或显示 HTML 元素。ng-show:显示或隐藏 HTML 元素。ng-href:为<a>元素指定链接。ng-if:如果条件为 false 移除 HTML 元素。ng-include:在应用中包含 HTML 文件,如<div ng-include="'myFile.htm'"></div>,但不能执行js代码,引入格式如下<style>p {color: red;}</style><p>大家好</p>ng-keydown:规定按下按键事件的行为。ng-keypress:规定按下按键事件的行为,通常情况下会用ng-keydown。ng-keyup:规定松开按键事件的行为。*ng-list:输出时将文本转换为列表 (数组),输入文本时用逗号隔开。<input ng-model="customers" ng-list/><pre>{{customers}}</pre>*ng-model-options:规定如何更新模型,option	指定了绑定数据的规则,规则如下:{updateOn: 'event'}规则指定事件发生后绑定数据,如ng-model-options="{updateOn: 'blur'}"{debounce : 1000} 规定等待多少毫秒后绑定数据{allowInvalid : true|false} 规定是否需要验证后绑定数据{getterSetter : true|false} 规定是否作为 getters/setters 绑定到模型{timezone : '0100'} 规则是否使用时区ng-mousedown:规定按下鼠标按键时的行为。ng-mouseenter:规定鼠标指针穿过元素时的行为。ng-mouseleave:规定鼠标指针离开元素时的行为。ng-mousemove:规定鼠标指针在指定的元素中移动时的行为。ng-mouseover:规定鼠标指针位于元素上方时的行为。ng-mouseup:规定当在元素上松开鼠标按钮时的行为。*ng-non-bindable:规定元素或子元素不能绑定数据,如<p ng-non-bindable>不使用 AngularJS: {{ 5+5 }}</p>显示的是“5+5”而不是“10”*ng-open:指定元素的 open 属性,可设值为true|false,常与details等具展开效果的元素配合使用。<details ng-open=true><summary>学的不仅是技术,更是梦想!</summary><p> - 菜鸟教程</p></details>ng-options:在 <select> 下拉列中指定 <options>,如<select ng-model="selectedName" ng-options="item for item in names"></select>数据格式为字符串数组["",""] 使用x for x in names数据格式为单独的对象{"a":1,"b":2} 使用x for (x,y) in names数据格式为对象数组[{},{}] 使用x.attr for x in names	ng-selected:指定元素的 selected 属性,表示当前选择项,常需与select元素配合使用,类似于ng-checked。ng-readonly:指定元素的 readonly 属性。ng-repeat:定义集合中每项数据的模板,该参数还常与ng-click、ng-class配合使用<option ng-repeat="x in address">{{x}}</option>ng-src:指定 <img> 元素的 src 属性。*ng-srcset:指定 <img> 元素的 srcset 属性。H5的新属性,允许输入多张图片地址以匹配不同w像素值宽度的容器。  <img ng-src="source.jpg" width="100%" ng-srcset="source_400.jpg 400w, source_600.jpg 600w, source_1280.jpg 1280w">ng-style:指定元素的 style 属性,可在控制器中为ng-style所在变量赋值。ng-submit:规定submit 事件的行为。ng-switch:规定显示或隐藏子元素的条件。常与ng-switch-when配合使用,类似于switch和caseng-value:规定 input 元素的值。angular.lowercase()	将字符串转换为小写angular.uppercase()	将字符串转换为大写angular.copy()	数组或对象深度拷贝*angular.forEach()	对象或数组的迭代函数var objs = [{a: 1}, {a: 2}];angular.forEach(objs, function(data, index, array) {//data等价于array[index]console.log(data.a + '=' + array[index].a);});var objs = {"a":1,"b":2}angular.forEach(objs, function(data, index, array) {//1 "a" {a: 1, b: 2}console.log(data,index,array);});angular.isArray()	如果引用的是数组返回 trueangular.isDate()	如果引用的是日期返回 trueangular.isDefined()	如果引用的已定义返回 trueangular.isElement()	如果引用的是 DOM 元素返回 trueangular.isFunction()	如果引用的是函数返回 trueangular.isNumber()	如果引用的是数字返回 true,如果输入框是input标签,要检测输入框内容是否为数字,则使用!isNaN($scope.myInput);angular.isObject()	如果引用的是对象返回 trueangular.isString()	如果引用的是字符串返回 trueangular.isUndefined()	如果引用的未定义返回 trueangular.equals(a,b)	如果两个对象相等返回 true*angular.fromJson()	反序列化 JSON 字符串*angular.toJson()	序列化 JSON 字符串
-->

二. 在一个页面里创建多个ng-app

有人说,这不是很简单吗?在不同元素标签中设置指令ng-app就可以了。其实,在Angular1.x中,框架只承认第一个ng-app,即通过var app = angular.module("myApp", []);即可获取它的操作权;此时第二个ng-app需要我们自己来初始化,代码如下:

<div id="A1" ng-app="app1"><input ng-model="name" type="text" placeholder="请输入姓名"><p>我的姓名: {{name}}</p>
</div><div id="A2" ng-app="app2"><input ng-model="age" type="number" placeholder="请输入年龄"><p>我的年龄: {{age}}</p>
</div>
<script type="text/javascript">var app1 = angular.module("app1", []); //自动加载var app2 = angular.module("app2", []); //手动加载angular.bootstrap(document.getElementById("A2"), ['app2']); // 手动加载2
</script>

(注)正常情况下一个页面只需一个ng-app即可满足。

三. 架构中创建编译元素

在原生js中,通过脚本添加一个新的元素标签很简单,但是在Angular1.x中,添加新的元素则需要通过编译实现,编译的目的在于让添加的脚本代码支持ng-?指令及{{}}表单式。展示代码如下:

<div ng-app="myApp" ng-controller="myCtrl as ctrl"><div id="addEle"></div>
</div>
<script>var app = angular.module("myApp", []);app.controller("myCtrl", function($scope, $compile) {var vm = this;vm.msg = 'hello';// 创建编译函数var compileFn = $compile('<div>{{ctrl.msg}}</div>');// 传入scope,得到编译好的dom对象(已封装为jqlite对象)// 也可以用$scope.$new()创建继承的作用域var $dom = compileFn($scope);//返回的$dom是一个jQLite(jQuery的子集)对象console.log($dom);// 添加到文档中var jqLite = angular.element(document.getElementById("addEle"));jqLite.append($dom);//$dom.remove(); //移除语句});
</script>

四. jqLite的应用

jquery是js开发中常用的一个开发库,那么在Angluar1.x框架中想要使用jquery,是否需要把它引用进来?答案是不用。因为Angluar1.x已经内嵌了jquery的源码,即jqLite。

var jqEle = $("#myDiv"); //jquery写法
var jqLite = angular.element(document.getElementById("myDiv")); //jqlite写法

五. 过滤器的应用

过滤器可以用于对显示数据的转换或过滤。在Angular1.x中用一个竖条"|"表示过滤器,如{{name | uppercase}}表示将name的值在显示时全部转化为大写。下面是一个对过滤器有详细代码标注的demo,其中除了系统提供的过滤条件外,还包括了如何自定义过滤器的实现:

<!--描述:过滤器uppercase:格式化字符串为大写lowercase:格式化字符串为小写currency:格式化为货币符号limitTo : 正数,表示从头开始截取;负数表示从尾巴开始截取number : 格式化为保留小数点date : 格式化为时间orderBy:"?":某属性按从小到大排序 ( orderBy:'-id' , id 降序排列   )  ( orderBy:'id',  id 升序排列   )filter:"?":按条件过滤,如filter:{'name':'iphone'}为查找属性name值为iphone的对象
-->
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><script type="text/javascript" src="../js/libs/angular/angular.js"></script></head><body><div ng-app="myApp" ng-controller="myCtrl"><input type="text" ng-model="name" /><span>大写:{{name | uppercase}}</span><span>小写:{{name | lowercase}}</span><br /><p>货币符号:{{ 250 | currency:"RMB" }}</p><p>正数截取4位:{{"1234567890" | limitTo :4}} </p><p>负数截取4位:{{"1234567890" | limitTo:-4}} </p><p>保留2位小数点:{{149016.1945000 | number:2}}</p><p>time转化为时间:{{1490161945000 | date:"yyyy-MM-dd HH:mm:ss"}}</p><p>排序及按条件筛选:</p><input type="text" ng-model="inData" /><ul><li ng-repeat="x in names | orderBy:'-country' | filter : inData">{{ x.name + ', ' + x.country }}</li></ul><p>自定义过滤器,输入一个数值,得到该值+1结果:</p><input type="text" ng-model="inDIY" /><p>{{inDIY|addOne}}</p><p>{{inDIY|addOneFilter}}</p></div><script>var app = angular.module("myApp", []);app.controller("myCtrl", function($scope) {$scope.names = [{name: 'Jani',country: 'Norway'},{name: 'Hege',country: 'Sweden'},{name: 'Kai',country: 'Denmark'}];});//自定义过滤器app.filter('addOne', function() {return function(i) {var result = 0;if(!isNaN(i)) {result = 1 + parseInt(i);}return result;}});//自定义过滤器带参数app.service('addOneService', function() {this.add = function(i) {var result = 0;if(!isNaN(i)) {result = 1 + parseInt(i);}return result;}});app.filter('addOneFilter', ['addOneService', function(addOneService) {return function(i) {return addOneService.add(i);};}]);</script></body></html>

六. form表单标准

AngularJS1.x有专门针对form表单的系统检验指令。主要通过myForm.*.*.type或myForm.*.*的引用,其中第一个参数为form的name属性值,第二个参数为form中元素的name属性值。如myForm.myEmail.$error.email则检验name="myEmail"的元素输入的值是否符合email的书写规范,若符合则返回ture,反之为false。更多的检验列表如下:

 $error.required 唯一值验证$error.email 文本输入内置电子邮件验证。$error.number 带有数量验证的文本输入。也可以有最小和最大值的附加属性。$error.date 带有输入日期文本输入。$error.url 带有输入验证的URL文本输入。$error.minlength,参数范围需从input中ng-minlength设置$error.maxlength,参数范围需从input中ng-maxlength设置$error.pattern,正则表达式需从input中ng-pattern设置$dirty 表单有填写记录 $pristine 表单没有填写记录$valid 字段内容合法的,如formname.$valid$invalid 字段内容是非法的 

标准的表单脚本如下:

<!--描述:基本表单元素及表单验证 ng-options:下拉列选择框 ,如<select ng-init="selectedName = names[0]" ng-model="selectedName" ng-options="x for x in names"></select>数据格式为字符串数组["",""] 使用x for x in names数据格式为单独的对象{x:y} 使用x for (x,y) in names数据格式为对象数组[{},{}] 使用x.attr for x in names	ng-repeat:重复元素,如<option ng-repeat="x in address">{{x}}</option>
-->
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>demo-ng-form</title><style>input.ng-invalid {background-color: lightblue;}</style><script type="text/javascript" src="../js/libs/angular/angular.js"></script></head><body><div ng-app="myApp" ng-controller="myCtrl"><form name="myForm"><label for="in_text">姓名:</label><input id="in_text" type="text" ng-model="in_text" name="myName" required/><span ng-show="myForm.myName.$error.required">(姓名为必填项)</span><br /><label>性别:</label><input type="radio" name="mySex" ng-model="in_Sex" value="男" ng-checked="true" />男<input type="radio" name="mySex" ng-model="in_Sex" value="女" />女<br /><label>课程:</label><input type="checkbox" ng-model="in_checkbox1" />课程1<input type="checkbox" ng-model="in_checkbox2" />课程2<br /><label>邮箱:</label><input type="email" ng-model="in_email" name="myEmail" /><span ng-show="myForm.myEmail.$error.email">(邮箱格式不正确)</span><br /><label>电话:</label><input type="tel" ng-model="in_tel" /><br /><label>居住:</label><!--<select ng-model="in_select" ng-init="in_select = address[0]" ng-options="x for x in address"></select>--><select ng-model="in_select" ng-init="in_select = address[0]"><option ng-repeat="x in address">{{x}}</option></select><br /><label>评价:</label><textarea ng-model="in_textarea" cols="10" rows="10"></textarea><br /><button ng-click="ok()">提交</button></form></div><script>var app = angular.module("myApp", []);app.controller("myCtrl", function($scope) {$scope.in_text = "";$scope.in_Sex = "男";$scope.in_checkbox1 = $scope.in_checkbox2 = false;$scope.in_email = "";$scope.in_tel = "";$scope.address = ["厦门", "泉州", "福州"];$scope.ok = function() {console.log("姓名:", $scope.in_text);console.log("性别:", $scope.in_Sex);console.log("课程1:", $scope.in_checkbox1);console.log("课程2:", $scope.in_checkbox2);console.log("邮箱:", $scope.in_email);console.log("电话:", $scope.in_tel);console.log("居住:", $scope.in_select);console.log("评价:", $scope.in_textarea);console.log("-----------------分割线--------------------");}});</script></body></html>


(注)$valid和ng-valid,返回Boolean,告诉我们这一项当前基于你设定的规则是否验证通过
(注)$invalid和ng-invalid,返回Boolean,告诉我们这一项当前基于你设定的规则是否验证未通过

 

七. 表格的实现

此处贴出一段表格代码,关键在于<table>标签的使用及样式的调整:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>demo-ng-table</title><script type="text/javascript" src="../js/libs/angular/angular.js"></script><style>table,th,td {border: 1px solid grey;border-collapse: collapse;padding: 5px;}table tr:nth-child(odd) {background-color: #f1f1f1;}table tr:nth-child(even) {background-color: #ffffff;}</style><!--写法2--><!--<style>table,td {border: 1px solid grey;border-collapse: collapse;padding: 5px;}</style>--></head><body><div ng-app="myApp" ng-controller="customersCtrl"><table><tr ng-repeat="x in names"><td>{{ $index + 1 }}</td><td>{{ x.Name }}</td><td>{{ x.Country }}</td></tr></table><!--写法2--><!--<table><tr ng-repeat="x in names"><td ng-if="$odd" style="background-color:#f1f1f1">{{ x.Name }}</td><td ng-if="$even">{{ x.Name }}</td><td ng-if="$odd" style="background-color:#f1f1f1">{{ x.Country }}</td><td ng-if="$even">{{ x.Country }}</td></tr></table>--></div><script>var app = angular.module('myApp', []);app.controller('customersCtrl', function($scope, $http) {$scope.names = [{"Name": "Alfreds Futterkiste","City": "Berlin","Country": "Germany"}, {"Name": "Ana Trujillo Emparedados y helados","City": "México D.F.","Country": "Mexico"}, {"Name": "Antonio Moreno Taquería","City": "México D.F.","Country": "Mexico"}, {"Name": "Around the Horn","City": "London","Country": "UK"}, {"Name": "B's Beverages","City": "London","Country": "UK"}, {"Name": "Berglunds snabbköp","City": "Luleå","Country": "Sweden"}, {"Name": "Blauer See Delikatessen","City": "Mannheim","Country": "Germany"}, {"Name": "Blondel père et fils","City": "Strasbourg","Country": "France"}, {"Name": "Bólido Comidas preparadas","City": "Madrid","Country": "Spain"}, {"Name": "Bon app'","City": "Marseille","Country": "France"}, {"Name": "Bottom-Dollar Marketse","City": "Tsawassen","Country": "Canada"}, {"Name": "Cactus Comidas para llevar","City": "Buenos Aires","Country": "Argentina"}, {"Name": "Centro comercial Moctezuma","City": "México D.F.","Country": "Mexico"}, {"Name": "Chop-suey Chinese","City": "Bern","Country": "Switzerland"}, {"Name": "Comércio Mineiro","City": "São Paulo","Country": "Brazil"}];});</script></body></html>

 

八. switch、switch-when的应用

switch、switch-when正体现的AngularJS1.x的强大之处,这意味着能将类似于if、else的功能写到元素标签中。下述demo实现了点击不同的单选按钮,同一个<div>里会显示不同的内容,源码如下:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>demo-ng-switch</title><script type="text/javascript" src="../js/libs/angular/angular.js" ></script></head><body><div ng-app="myApp" ng-controller="myCtrl"><form>选择一个选项:<input type="radio" ng-model="myVar" value="dogs">Dogs<input type="radio" ng-model="myVar" value="tuts">Tutorials<input type="radio" ng-model="myVar" value="cars">Cars</form><div ng-switch="myVar"><div ng-switch-when="dogs"><h1>Dogs</h1><p>Welcome to a world of dogs.</p></div><div ng-switch-when="tuts"><h1>Tutorials</h1><p>Learn from examples.</p></div><div ng-switch-when="cars"><h1>Cars</h1><p>Read about cars.</p></div></div></div><script>var app = angular.module("myApp", []);app.controller("myCtrl", function($scope) {});</script></body></html>

九. 高阶知识-自定义指令

自定义指令泛指自定义元素标签、自定义元素属性等,它的使用目的是:

1. 使你的Html更具语义化,不需要深入研究代码和逻辑即可知道页面的大致逻辑。
2. 抽象一个自定义组件,在其他地方进行重用。

指令命名遵循驼峰命名法,使用时驼峰间用-分隔。自定义代码结构如下:

angular.module("app",[]).directive("directiveName",function(){ return{//通过设置项来定义 restrict: "EACM",template: "<p>helloWorld</p>",replace: true,//渲染成功后的回调link: function(scope, element, attrs) {}};
})

(注)template:自定义标签模板,当其值长度过大时,可以用templateUrl代替,即把模板指向一个独立的HTML文。如果想保留模板内的标签,只需加上<span ng-transclude></span>即可。

我们自定义了一个标签名为directiveName的元素,该元素显示为一段helloWorld文本。

元素表现为:<directive-Name></directive-Name>

设置项restrict:EACM,每个字母表示一种使用自定义指令的方式。

设置项:
restrict:E:标签使用 
restrict:A:属性使用
restrict:C:类名使用
restrict:M,需同步设replace:true:注释使用

基础的自定义指令完整的演示脚本如下:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>demo-ng-directive</title><script type="text/javascript" src="../js/libs/angular/angular.js"></script></head><body ng-app="myApp"><input type="text" ng-model="inData" ng-init="inData=0" /><mydirective></mydirective><div mydirective></div><div class="mydirective"></div><!-- directive: mydirective --><script>var app = angular.module("myApp", []);app.directive("mydirective", function() {return {restrict: "EACM",replace: true,template: "<p>helloWorld</p>",link: function(scope, element, attrs) {}};});</script></body></html>

自定义指令还有两个很常用的使用场景:

//渲染完成事件触发
<span on-ot-finish-render-filters></span>
$scope.$on('ot_ngRepeatFinished', function(ngRepeatFinishedEvent) {});
ngApp.directive('onOtFinishRenderFilters', function($timeout) {return {restrict: 'A',link: function(scope, element, attr) {$timeout(function() {scope.$emit('ot_ngRepeatFinished');});}};
});
//重定义元素系统事件
<input type="file" id="upload" custom-on-change="uploadFile">
ngApp.directive('customOnChange', function() {return {restrict: 'A',link: function(scope, element, attr) {var onChangeHandler = scope.$eval(attr.customOnChange);element.bind('change', onChangeHandler);}};
});

十. 高阶知识-自定义服务

服务是一个函数或对象,可在你的 AngularJS 应用中使用。AngularJS 内建了30 多个服务。如常见的$scope、$http、$location、$interval、$timeout等。自定义服务的目的在于定义一些公共方法,实现便捷开发及代码重用。自定义服务常用于在控制器中,除此之外,还能用在上篇幅内容中的自定义过滤器filter。下面是一个定义了一个包含相加和相减算法的自定义服务。

<div ng-app="myApp" ng-controller="myCtrl"><input type="number" ng-model="num1" /><input type="number" ng-model="num2" /><button ng-click="countFun();">计算</button><br /><p ng-model="jia">相加:{{jia}}</p><p ng-model="jian">相减:{{jian}}</p>
</div><script>var app = angular.module("myApp", []);app.service("countNum", function() {this.jia = function(a, b) {return parseInt(a) + parseInt(b);}this.jian = function(a, b) {return parseInt(a) - parseInt(b);}});app.controller("myCtrl", function($scope, countNum) {$scope.num1 = 0;$scope.num2 = 0;$scope.jia = 0;$scope.jian = 0;$scope.countFun = function() {$scope.jia = countNum.jia($scope.num1, $scope.num2);$scope.jian = countNum.jian($scope.num1, $scope.num2);}});
</script>

十一. 高阶知识-依赖注入di

依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。简而言之,就是定义一个对外开放的服务service,服务service的实现算法由第三方决定。di主要有五个核心组件:

service:对外开放的服务
value:Value 是一个简单的 javascript 对象,用于向控制器传递值(配置阶段)。
factory:是一个函数,用于向service提供计算或返回值。
provider:功能与factory相似,定义一个factory函数,用于向service提供计算或返回值。。
constant:constant(常量)用来在配置阶段传递数值,注意这个常量在配置阶段是不可用的。

依赖注入有两种写法,一种是通过.factory;另一种是通过.provider。依赖注入的展示源码如下:

<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><!-- 依赖注入写法1 -->
<script>var mainApp = angular.module("mainApp", []);mainApp.value("defaultInput", 5);mainApp.constant("configParam", "constant value");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, configParam) {$scope.number = defaultInput;$scope.result = CalcService.square($scope.number);$scope.square = function() {$scope.result = CalcService.square($scope.number);}console.log(defaultInput);console.log(configParam);});
</script><!-- 依赖注入写法2 -->
<!--<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.constant("configParam", "constant value");mainApp.service('CalcService', function(MathService) {this.square = function(a) {return MathService.multiply(a, a);}});mainApp.controller('CalcController', function($scope, CalcService, defaultInput, configParam) {$scope.number = defaultInput;$scope.result = CalcService.square($scope.number);$scope.square = function() {$scope.result = CalcService.square($scope.number);}console.log(defaultInput);console.log(configParam);});
</script>-->

十二. 高阶知识-$http请求

http请求主要分3种方式:get、post、jsonp。

$http请求通用请求结构如下(支持get/post):

$http({method: 'POST',url: 'url'
}).then(function successCallback(response) {// 请求成功执行代码
}, function errorCallback(response) {// 请求失败执行代码
})

其他的$http请求写法如下:

$ttp请求时设置参数:
$http.get('url', {params: {name:'lisa'}})。
$http.jsonp("url?callback=CALLBACK&name='lisa'")
$http({method: 'post',url: 'url',params:{'name':'lisa'}, data: blob
})

在使用jsonp请求时,还需要为请求地址设置白名单才会请求成功:

//配置http访问的白名单,使用jsonp时用到
app.config(function($sceDelegateProvider) {$sceDelegateProvider.resourceUrlWhitelist(['self', //本域'http://voice.yoya.com/**' //跨域]);
});

$http请求时,要注意一个跨域问题。若不在同一个域,则会因为跨域导致请求失败,此时需要在java服务端加入跨域允许脚本,前端不用修改代码:

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods","POST");
response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");

有时候服务端会要求$http请求会自带特定头信息,可通过下面代码实现:

var app = angular.module("myApp", [], function($httpProvider) {$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
});

$http请求拦截实现代码如下,可以在返回的http信息进行过滤后再返回业务层处理:

//http请求拦截,支持拦截post、get、jsonp
app.config(function($httpProvider) {$httpProvider.interceptors.push(function( /**此处可加service*/ ) {return {'request': function(config) {console.log(config);return config;},'response': function(response) {console.log(response);return response;},'responseError': function(Error) {console.log(Error);}}});
});

三种方式完整的$http请求源码如下:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>demo-ng-http</title><script type="text/javascript" src="../js/libs/angular/angular.js"></script><script type="text/javascript" src="../js/libs/transformCode.js"></script></head><body><div ng-app="myApp" ng-controller="myCtrl"><button ng-click="requesthttp();">跨域请求语音服务</button><p>请求结果:</p><p ng-model="result">{{result}}</p><audio ng-src="{{audioURL}}" controls="controls"></audio></div><script>var app = angular.module("myApp", [], function($httpProvider) {$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';});//http请求拦截,支持拦截post、get、jsonpapp.config(function($httpProvider) {$httpProvider.interceptors.push(function( /**此处可加service*/ ) {return {'request': function(config) {console.log(config);return config;},'response': function(response) {console.log(response);return response;},'responseError': function(Error) {console.log(Error);}}});});//配置http访问的白名单,使用jsonp时用到app.config(function($sceDelegateProvider) {$sceDelegateProvider.resourceUrlWhitelist(['self', //本域'http://voice.yoya.com/**' //跨域]);});//post、get、jsonp请求app.controller("myCtrl", function($scope, $http, $timeout) {$scope.requesthttp = function() {//jsonpvar beanObject = new Object();beanObject.roleid = "701";beanObject.nsspermissions = "public";beanObject.volumn = "50";beanObject.speed = "50";beanObject.ttstxet = encodeURI("123");//验证object转为jsonvar jsonData = JSON.stringify(beanObject);$http.jsonp('http://localhost:80/ninVoiceService_V2/NewTTSJP?base64Data=' + jsonData, {jsonpCallbackParam: 'jsonpcallback'}).then(function(response) {console.log("success:", response);}, function(response) {console.log("error:", response);});
//					return;// get 请求一个json文件
//					$http.get("http://nss-public.yoya.com/netinnet-movie-pro/data/release_movie/201612/57832e74e4b005e960aec8ad00000000/20161223111741/58212c7ae4b0d8e28b0684d300000000/play.json")
//						.then(function(response) {
//							console.log("success:", response);
//						}, function(response) {
//							console.log("error:", response);
//						});
//
//					return;// post 请求一段TTS音频
//					var msg = "大家好,欢迎来到优芽";
//					var beanObject = new Object();
//					beanObject.roleid = "701";
//					beanObject.nsspermissions = "public";
//					beanObject.volumn = "50";
//					beanObject.speed = "50";
//					beanObject.ttstxet = encodeURI(msg);
//					var jsonData = JSON.stringify(beanObject);
//					var param_Base64 = encode64(jsonData); //transformCode.js参数加密
//					$http({
//						method: 'post',
//						url: 'http://localhost:80/ninVoiceService_V2/NewTTS',
//						params: {
//							'name': 'lisa' //值对格式参数
//						},
//						data: param_Base64 //文本流格式参数,若没有则可移除
//					}).then(function(response) {
//						console.log("success:", response);
//						$timeout(function() {
//							var url = response.data.url;
//							$scope.audioURL = url.toString(); 
//						}, 5000);
//					}, function(response) {
//						console.log("error:", response);
//					});}});</script></body></html>

十三. 高阶知识-上传文件

上传文件是指如上传图片、压缩包等,其上传原理与原生js上传没有太大的差异,无非是写法不一致而已。下面是一段上传图片的完整代码:

<div ng-app="myApp" ng-controller="myCtrl"><input type="file" id="upload" custom-on-change="uploadFile">
</div>
<script>var app = angular.module("myApp", []);app.controller("myCtrl", function($scope, $http) {//上传事件$scope.uploadFile = function(event) {var files = event.target.files[0];document.querySelector("#upload").value = "";var fileSize = files.size;var size = fileSize / 1024;if(size > 10000) {tipsMsg("上传的图片不能大于10M");return}var reqURL = "";var params = {};var data = new FormData();data.append('image', files);$http({method: 'post',url: reqURL,params: params,data: data,headers: {'Content-Type': undefined},transformRequest: angular.identity}).then(function successCallback(response) {console.log(response);}, function errorCallback(response) {console.log(response);});}});app.directive('customOnChange', function() {return {restrict: 'A',link: function(scope, element, attr) {var onChangeHandler = scope.$eval(attr.customOnChange);element.bind('change', onChangeHandler);}};});
</script>

(注)anjularjs对于post和get请求默认的Content-Type是application/json。通过设置‘Content-Type’: undefined,这样浏览器不仅帮我们把Content-Type 设置为 multipart/form-data,还填充上当前的boundary,如果你手动设置为: ‘Content-Type’: multipart/form-data,后台会抛出异常:the current request boundary parameter is null。 通过设置 transformRequest: angular.identity ,anjularjs transformRequest function 将序列化我们的formdata object.

十四. 高阶知识-路由的应用

AngularJS路由是指实现多视图的单页面效果。在单页Web应用中 AngularJS 通过 # + 标记 实现,例如http://***.com/#/first,当我们点击任意一个链接时,向服务端请的地址都是一样的 (http://***.com/)。 因为 # 号之后的内容在向服务端请求时会被浏览器忽略掉。 所以我们就需要在客户端实现 # 号后面内容的功能实现。因此AngularJS 路由 就通过 # + 标记 帮助我们区分不同的逻辑页面并将不同的页面绑定到对应的控制器上。

这里要值得注意的是,AngularJS1.6.x的路由与1.5.x有所不同,在配置路由时,需加上这句代码:

$locationProvider.hashPrefix(''); // 1.6.x版本使用路由功能需加上这句

否则路由将无法生效,这是因为1.6.x版本的路由跳转视图时,会在跳转的视图路径后面默认多增加#!符号,导致框架无法识别该视图地址。(感觉这个更新是个坑),除了这种解决办法外,还有一种办法就只指定视图地址时,使用如下方法指定:

<a href="#!/red">红色方块</a> 

下面是一段完整的路由使用代码:

<html><head><meta charset="utf-8" /><title>AngularJS 视图</title><script src="../js/libs/angular/angular.js"></script><script src="../js/libs/angular/angular-route.js"></script></head><body><div ng-app="myApp"><ul><li><a href="#red">红色方块视图</a></li><li><a href="#blue?a=123">蓝色方块视图</a></li></ul><p>内容切换:</p><div ng-view></div><script type="text/ng-template" id="red.html"><p>{{message}}</p><div style="width: 100px; height: 100px; background-color: red;"></div></script><script type="text/ng-template" id="blue.html"><p>{{message}}</p><div style="width: 100px; height: 100px; background-color: blue;"></div></script></div><script>var myApp = angular.module("myApp", ['ngRoute']);myApp.config(["$locationProvider", "$routeProvider", function($locationProvider, $routeProvider) {//  <a href="#!/red">红色方块</a>  $locationProvider.hashPrefix(''); // 1.6.x版本使用路由功能需加上这句$routeProvider.when('/red', {templateUrl: 'red.html',controller: 'redController'}).when('/blue', {templateUrl: 'blue.html',controller: 'blueController',//依赖的条件resolve: {//延时1秒切换视图delay: function($q, $timeout) {var delay = $q.defer();$timeout(delay.resolve, 1000);return delay.promise;}}}).otherwise({//重定向地址redirectTo: '/red' // 默认显示红色方块视图});}]);//红色方块视图操作区myApp.controller("redController", function($scope) {$scope.message = "当前显示的是红色方块视图"; // red作用域});//蓝色方块视图操作区myApp.controller("blueController", function($scope, $routeParams) {$scope.message = "当前显示的是蓝色方块视图"; // blue作用域console.log($routeParams); //传递参数});</script></body></html>

(注)路由的视图页面应作为模板页显示,只包括元素和css,因此视图页不引入js文件也不执行js代码。想要控制相应视图页,可通过该视图页的定义的控制器作用域下进行控制。

以上就是我所了解的AngularJS1.x的知识,理解了这些知识,要使用AngularJS1.x框架要开发一款就不会有太多阻碍了,有需要知识交流的可留言。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Angular 总结

    简介 Angular 是一个基于 TypeScript 构建的开发平台。它包括&#xff1a; 一个基于组件的框架&#xff0c;用于构建可伸缩的 Web 应用 一组完美集成的库&#xff0c;涵盖各种功能&#xff0c;包括路由、表单管理、客户端-服务器通信等 一套开发工具&#xff0c;可帮助你开…...

    2024/5/3 4:58:12
  2. Angular 实例项目 angular-phonecat 的一些问题

    PhoneCat项目的源代码托管在GitHub上&#xff0c;因此获取源代码之前需要安装Git (http://git-scm.com/download )。 安装Git后&#xff0c;可以通过git clone来下载源代码&#xff1a; 1&#xff0c;获取angular-phonecat 项目源代码 输入命令&#xff1a; git clone --dept…...

    2024/4/20 11:08:46
  3. Angular.js学习之二表单应用实例

    开始实例之前要先了解angular提供了哪些常用的表单验证命令&#xff1a; 1. required指令: 相当于Html5的required属性,验证不能为空 <input type"text" required /> 2. ng-maxlength属性: 验证文本框内容的长度最大值 <input type"text" ng-maxl…...

    2024/4/29 15:23:47
  4. Angular10 配置 webpack 打包

    对于 Angular 项目&#xff0c;推荐使用 angular-cli 创建打包项目 Angular 会默认帮我们配置。 但是有特殊的需求时就显然不是很灵活&#xff0c;比如想分割一些较大的打包文件、分析每个打包文件组成&#xff0c;自定义webpack一些参数的时候就发现无从下手。 对许多项目的常…...

    2024/4/28 5:19:18
  5. Angular 组件交互

    Angular 组件交互 组件交互&#xff1a; 组件通讯&#xff0c;让两个或多个组件之间共享信息。 使用场景&#xff1a; 当某个功能在多个组件中被使用到时&#xff0c;可以将该特定的功能封装在一个子组件中&#xff0c;在子组件中处理特定的任务或工作流。 交互方式&#xff1…...

    2024/4/28 12:00:08
  6. Angular浅析

    接触Angular有一段时间了&#xff0c;有必要系统的回顾一下&#xff1a; Angular介绍 库和框架的区别 jQuery&#xff1a;库 库一般都是封装了一些常用的方法自己手动去调用这些方法&#xff0c;来完成我们的功能code $(#txt).val(我是小明); $(div).text(xx);angular&#…...

    2024/4/28 1:44:14
  7. Angular CLI简介

    一、简介 Angular CLI用于简单&#xff0c;快速构建Angular2项目&#xff0c;只要掌握几行命令就能扣减前端架构。依赖于NodeJs和npm。 Git 源代码地址&#xff1a;https://github.com/angular/angular-cli AngularCLI主要特性 1 Angular CLI 可以快速搭建框架&#xff0c;创…...

    2024/5/2 14:14:15
  8. Angular Route基础路由

    一&#xff0c;基本指令组件、模块、路由之间的关系图&#xff1a;二&#xff0c;创建路由项目 新建项目时带--routing后&#xff0c;会多生成一个app.module.ts ng new router --routing 或者直接使用指令&#xff1a; ng generate module app-routing --flat --moduleapp --f…...

    2024/4/28 16:29:23
  9. 将angular项目部署到Linux服务器上(使用Nginx)

    1、在命令行中使用命令ng build --prod将angular项目打包好&#xff0c;打包好了之后会出现一个dist文件&#xff0c;如下图所示&#xff1a; 2、将dist文件传入服务器当中&#xff0c;例如放置于 /usr/local/ngWeb 文件夹下。 3、配置Nginx&#xff0c;修改 /usr/local/nginx…...

    2024/4/28 0:13:45
  10. Angular9 animations

    Angular9 animations 1、 需要引入BrowserAnimationsModule import { BrowserModule } from angular/platform-browser; import { BrowserAnimationsModule } from angular/platform-browser/animations; import { NgModule } from angular/core;import { AppComponent } fro…...

    2024/4/28 8:03:04
  11. angular2 国内环境搭建

    最近在学习angular&#xff0c;看了官方的文档也自己找了不少文档&#xff0c;但是总是这里那里报错&#xff0c;终于搞好了&#xff0c;记录一下这个曲折的过程。 1、利用淘宝镜像安装angular-cli: npm install -g angular-cli –registryhttps://registry.npm.taobao.org …...

    2024/4/28 18:36:12
  12. Angular1.x学习

    引入AngularJS库文件 <script type”text/javascript” src”angular.min.js”></script>一般的js文件都是放在<body>的底部&#xff0c;为了优化应用加载时间 AngularJS的加载执行过程&#xff1a; HTML页面加载的时候&#xff0c;会触发加载页面包含的所…...

    2024/4/28 2:02:56
  13. angular基础入门文档以及博客汇集

    angular入门anrualar知识点相对应文档来源注解析 ng-class http://www.cnblogs.com/whitewolf/archive/2013/05/22/3092184.htmlCSDN实现class的控制...

    2024/4/29 2:49:37
  14. Angular官方文档的“快速上手”问题

    Angular官方文档的“快速上手”问题介绍问题products.tsapp.module.tscart.service.ts代码介绍 在 Angular 的 中文文档 “快速上手”部分&#xff0c;可能会给初学者带来很多困扰 原因就在于官方给的代码并不完整&#xff0c;导致编译时会出现错误&#xff0c;本文将修正这些…...

    2024/4/27 22:20:15
  15. angular的中文文档在这里。。

    链接 仿ant-design的 angular组件 echarts文档转载于:https://www.cnblogs.com/dhsz/p/7300219.html...

    2024/4/28 6:12:07
  16. storybook for angular

    storybook for angular 初试 文档 官方文档 angular示例 安装 依赖 storybook/cli zengwe$ npm i -g storybook/cli在angular项目下运行 zengwe$ getstorybook 初始化成功后会在项目下增加连个文件夹 ./.storybook ./src/stories 在stories下会有storybook的demo示例 im…...

    2024/4/30 16:14:28
  17. Angular--官方文档之 Angular CLI

    学习Angular官方文档的时候&#xff0c;参考https://angular.cn/guide/quickstart 这个快速开发的文档。 对于我这个AngularJs小白在看了Angular菜鸟教程后&#xff0c;只能说可以简单的运用一下。 看到一些专业术语&#xff0c;我也是一脸懵逼的。 1.Angular CLI是什么&…...

    2024/4/28 0:28:21
  18. Angular10 文件流下载

    Angular10 文件流下载downFile.service.tsdownloadFile.component.ts废话我就不说了&#xff0c;直接上代码downFile.service.ts downloadFile(id: any): Observable<Blob> {const params new HttpParams().set(id, id)return this.httpClient.get(this.urls.GetAdminIn…...

    2024/4/28 2:31:17
  19. angular ui-bootstrap文档

    http://angular-ui.github.io/bootstrap/转载于:https://www.cnblogs.com/gongshunkai/p/7071223.html...

    2024/4/28 15:32:04
  20. angular-cli 文档

    Angular/angular-cli 原文来自&#xff1a;https://github.com/angular/angular-cli Angular/angular-cli 原文来自&#xff1a;https://github.com/angular/angular-cli cli应用于基于ember-cli项目的Angular应用 备注: 如果你正从测试版或rc版本更新&#xff0c;请查看我们…...

    2024/4/28 16:43:37

最新文章

  1. Luminar开始为沃尔沃生产下一代激光雷达传感器

    在自动驾驶技术的浪潮中&#xff0c;激光雷达&#xff08;LiDAR&#xff09;传感器以其高精度和强大的环境感知能力&#xff0c;逐渐成为了该领域的技术之星。Luminar&#xff08;路安达&#xff09;公司作为自动驾驶技术的领军企业&#xff0c;近日宣布已开始为沃尔沃汽车生产…...

    2024/5/3 5:57:02
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 基于AI智能识别技术的智慧展览馆视频监管方案设计

    一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览…...

    2024/4/30 17:11:11
  4. ArcGIS10.8保姆式安装教程

    ArcGIS 10.8是一款非常强大的地理信息系统软件&#xff0c;用于创建、管理、分析和可视化地理数据。以下是ArcGIS 10.8的详细安装教程&#xff1a; 确保系统满足安装要求 在开始安装之前&#xff0c;请确保您的计算机满足以下系统要求&#xff1a; 操作系统&#xff1a;Windo…...

    2024/5/3 3:48:00
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57