【转】Angular运行原理揭秘 Part 1
当你用AngularJS写的应用越多, 你会越发的觉得它相当神奇. 之前我用AngularJS实现了相当多酷炫的效果, 所以我决定去看看它的源码, 我想这样也许我能知道它的原理. 下面是我从源码中找到的一些可以了解AngularJS那些高级(和隐藏)功能如何实现的代码.
1) 依赖注入的实现原理
依赖注入(DI)让我们可以不用自己实例化就能创建依赖对象的方法. 简单的来说, 依赖是以注入的方式传递的. 在Web应用中, Angular让我们可以通过DI来创建像Controllers和Directives这样的对象. 我们还可以创建自己的依赖对象, 当我们要实例化它们时, Angular能自动实现注入.
最常见的被注入对象应该是 $scope
对象. 它可以像下面这样被注入的:
function MainCtrl ($scope) { // access to $scope } angular .module(‘app’) .controller(‘MainCtrl’, MainCtrl);
对于从来没有接触过依赖注入的Javascript开发人员来说, 这样看起来只是像传递了一个参数. 而实际上, 他是一个依赖注入的占位符. Angular通过这些占位符, 把真正的对象实例化给我们, 让来看看他是怎么实现的.
function的参数
当你运行你代码的时候, 如果你把function声明中的参数换成一个其它字母, 那么Angular就无法找到你真正想实例化的对象. 因为Angular在我们的function上使用了 toString()
方法, 他将把我们的整个function变成一个字符串, 然后解析function中声明的每一个参数. 它使用下面4个正则(RegExps)来完成这件事情.
var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; var FN_ARG_SPLIT = /,/; var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
Angular做的第一件事情就是把我们的整个function转换为字符串, 这确实是Javascript很强大的地方. 转换后我们将得到如下字符串:
‘function MainCtrl ($scope) {...}’
然后, 他用正则移除了在 function()
中有可能的所有的注释.
fnText = fn.toString().replace(STRIP_COMMENTS, '');
接着它提取其中的参数部分.
argDecl = fnText.match(FN_ARGS);
最后它使用 .split()
方法来移除参数中的所有空格, 完美! Angular使用一个内部的 forEach
方法来遍历这些参数, 然后把他们放入一个 $inject
数组中.
forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { arg.replace(FN_ARG, function(all, underscore, name) { $inject.push(name); }); });
正如你现在想的, 这是一个很大的性能开销操作. 每个函数都要执行4个正则表达式还有大量的转换操作----这将给我们带来性能损失. 不过我们可以通过直接添加需要注入的对象到 $inject
数组中的方式来避免这个开销.
$inject
我们可以在function对象上添加一个 $inject
属性来告诉Angular我们的依赖对象. 如果对象是存在的, Angular将实例化它. 这样的语法更具有可读性, 因为我们可以这些对象是被注入的. 下面是一个例子:
function SomeCtrl ($scope) { } SomeCtrl.$inject = ['$scope']; angular .module('app', []) .controller('SomeCtrl', ['$scope', SomeCtrl]);
这将节省框架的大量操作, 它不用再解析function的参数, 也不用去操作数组(查看下一节数组参数), 它可以直接获取我们已经传递给他的 $inject
属性. 简单, 高效.
理想情况下我们应该使用构建工具, 比如 Grunt.js
或者 Gulp.js
来做这个事情: 让他们在编译时生成相应的 $injext
属性, 这样能让Web应用运行的更快.
注: 实际上上面介绍的内容并不涉如何实例化那些需要被注入的对象. 整个操作只是标记出需要的名字----实例化的操作将由框架的另一部分来完成.
数组参数
最后要提到的是数组参数. 数组的前面每个元素的名字和顺序, 刚是数组最后一个元素function的参数名字和顺序. 比如: [‘$scope’, function ($scope) {}]
.
这个顺序是非常重要的, 因为Angular是以这个顺序来实例化对象. 如果顺序不正确, 那么它可能将其它对象错误的实例化到你真正需要的对象上.
function SomeCtrl ($scope, $rootScope) {}angular.module('app', []) .controller('SomeCtrl', ['$scope', ‘$rootScope’, SomeCtrl]);
像上面一样, 我们需要做的就是把函数最为数组的最后一个元素. 然后Angular会遍历前面的每一个元素, 把它们添加到 $inject
数组中. 当Angular开始解析一个函数的时候, 它会先检查目标对象是不是一个数组类型, 如果是的话, 他将把最后一个元素作为真正的function, 其它的元素都作为依赖对象添加到 $inject
中.
} else if (isArray(fn)) {last = fn.length - 1; assertArgFn(fn[last], 'fn'); $inject = fn.slice(0, last); }
2) Factory和Service
Factory和Service看起来非常相似, 以至于很多开发人员都无法理解它们有什么不同.
当实例化一个 .service()
的时候, 其实他将通过调用 new Service()
的形式来给我们创建一个新的实例, .service()
的方法像是一个构造函数.
服务(service)实际上来说是一个最基本的工厂(factory), 但是它是通过 new
来创建的, 你需要使用 this
来添加你需要的变量和函数, 最后返回这个对象.
工厂(factory)实际上是非常接近面向对象中的"工厂模式(factory pattern)". 当你调用时, 它会创建新的实例. 本质上来说, 那个实例是一个全新的对象.
下面是Angular内部实际执行的源码:
function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); } function service(name, constructor) { return factory(name, ['$injector', function($injector) { return $injector.instantiate(constructor); }]); }
3) 从 $rootScope 中创建新的 $scope
所有的scope对象都继承于 $rootScope
, $rootScope
又是通过 new Scope()
来创建的. 所有的子scope都是用过调用 $scope.$new()
来创建的.
var $rootScope = new Scope();
它内部有一个 $new
方法, 让新的scope可以从原型链上引用它们的父scope, 子scope(为了digest cycle), 以及前后的scope.
从下面的代码可以看出, 如果你想创建一个独立的scope, 那么你应该使用 new Scope()
, 否则它将以继承的方式来创建.
我省略了一些不必要的代码, 下面是他的核心实现
$new: function(isolate) {var child; if (isolate) { child = new Scope(); child.$root = this.$root; } else { // Only create a child scope class if somebody asks for one, // but cache it to allow the VM to optimize lookups. if (!this.$$ChildScope) { this.$$ChildScope = function ChildScope() { this.$$watchers = null; }; this.$$ChildScope.prototype = this; } child = new this.$$ChildScope(); } child['this'] = child; child.$parent = this; return child; }
理解这一点对写测试非常重要, 如果你想测试你的Controller, 那么你应该使用 $scope.$new()
来创建$scope对象. 明白scope是如何创建的在测试驱动开发(TDD)中是十分重要的, 这将更加有助于你mock module.
4) Digest Cycle
digest cycle的实现其实就是我们经常看到的 $digest
关键字, Angular强大的双向绑定功能依赖于它. 每当一个model被更新时他都会运行, 检查当前值, 如果和以前的不同, 将触发listener. 这些都是脏检查(dirty checking)的基础内容. 他会检查所有的model, 与它们原来的值进行比较, 如果不同, 触发listener, 循环, 直到不在有变化为止.
$scope.name = 'Todd';$scope.$watch(function() { return $scope.name; }, function (newValue, oldValue) { console.log('$scope.name was updated!'); } );
当你调用 $scope.$watch
的时候, 实际上干了2件事情. watch的第一个参数是一个function, 这个function的返回你想监控的对象(如果你传递的是一个string, Angular会把他转换为一个function). digest cycle 运行的时候, 它会调用这个function. 第二个参数也是一个function, 当第一个function的值发生变化的时候它会被调用. 让我们看看他是怎么实现监控的:
$watch: function(watchExp, listener, objectEquality) {var get = $parse(watchExp); if (get.$$watchDelegate) { return get.$$watchDelegate(this, listener, objectEquality, get); } var scope = this, array = scope.$$watchers, watcher = { fn: listener, last: initWatchVal, get: get, exp: watchExp, eq: !!objectEquality }; lastDirtyWatch = null; if (!isFunction(listener)) { watcher.fn = noop; } if (!array) { array = scope.$$watchers = []; } // we use unshift since we use a while loop in $digest for speed. // the while loop reads in reverse order. array.unshift(watcher); return function deregisterWatch() { arrayRemove(array, watcher); lastDirtyWatch = null; }; }
这个方法将会把参数添加到scope中的 $$watchers
数组中, 并且它会返回一个function, 以便于你想结束这个监控操作.
然后digest cycle会在每次调用 $scope.$apply
或者 $scope.$digest
的时候运行. $scope.$apply
实际上是一个rootScope的包装, 他会从根$rootScope向下广播. 而 $scope.$digest
只会在当前scope中运行(并向下级scope广播).
$digest: function() {var watch, value, last,watchers,asyncQueue = this.$$asyncQueue,postDigestQueue = this.$$postDigestQueue,length,dirty, ttl = TTL,next, current, target = this, watchLog = [], logIdx, logMsg, asyncTask; beginPhase('$digest'); lastDirtyWatch = null; do { // "while dirty" loop dirty = false; current = target; traverseScopesLoop: do { // "traverse the scopes" loop if ((watchers = current.$$watchers)) { // process our watches length = watchers.length; while (length--) { try { watch = watchers[length]; // Most common watches are on primitives, in which case we can short // circuit it with === operator, only when === fails do we use .equals if (watch) { if ((value = watch.get(current)) !== (last = watch.last) && !(watch.eq ? equals(value, last) : (typeof value === 'number' && typeof last === 'number' && isNaN(value) && isNaN(last)))) { dirty = true; lastDirtyWatch = watch; watch.last = watch.eq ? copy(value, null) : value; watch.fn(value, ((last === initWatchVal) ? value : last), current); if (ttl < 5) { logIdx = 4 - ttl; if (!watchLog[logIdx]) watchLog[logIdx] = []; logMsg = (isFunction(watch.exp)) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp; logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last); watchLog[logIdx].push(logMsg); } } else if (watch === lastDirtyWatch) { // If the most recently dirty watcher is now clean, short circuit since the remaining watchers // have already been tested. dirty = false; break traverseScopesLoop; } } } catch (e) { $exceptionHandler(e); } } } } while ((current = next)); // `break traverseScopesLoop;` takes us to here if((dirty || asyncQueue.length) && !(ttl--)) { clearPhase(); throw $rootScopeMinErr('infdig', '{0} $digest() iterations reached. Aborting!\n' + 'Watchers fired in the last 5 iterations: {1}', TTL, toJson(watchLog)); } } while (dirty || asyncQueue.length); clearPhase(); while(postDigestQueue.length) { try { postDigestQueue.shift()(); } catch (e) { $exceptionHandler(e); } } }
这个实现非常有才, 虽然我没有进去看它是如何向下级广播的, 但这里的关键是循环遍历 $$watchers
, 执行里面的函数(就是那个你通过 $scope.$watch
注册的第一个function), 然后如果得到和之前不同的值, 他又将调用listener(那个你传递的第二个function). 然后, 砰! 我们得到了一个变量发生改变的通知. 关键是我们是如何知道一个值发生变化了的? 当一个值被更新的时候digest cycle会运行(尽管它可能不是必须的). 比如在 ng-model
上, 每一个keydown事件都会触发digest cycle.
$scope.$apply
当你想在Angular框架之外做点什么的时候, 比如在 setTimeout
的方法里面你想让Angular知道你可能改变了某个model的值. 那么你需要使用 $scope.$apply
, 你把一个function放在它的参数之中, 那么他会在Angular的作用域运行它, 然后在 $rootScope
上调用 $digest
. 它将向它下面所有的scope进行广播, 这将触发你注册的所有listeners和watchers. 这一点意味着Angular可以知道你更新了任何作用域的变量.
通过特征检查和闭包实现Polyfilling
Angular实现polyfilling的方式非常巧妙, 它不是用像 Function.prototype.bind
一样的方式直接绑定在一个对象的原型链上. Angular会调用一个function来判定浏览器是否支持这个方法(基础特征检查), 如果存在它会直接返回这个方法. 如果不存在, 他将使用一段简短的代码来实现它.
这样是比较安全的方式. 如果直接在原型链上绑定方法, 那么它可能会覆盖其它类库或者框架的代码(甚至是我们自己的代码). 闭包也让我们可以更安全的储存和计算那些临时变量, 如果存在这个方法, Angular将直接调用. 原生方法通常会带来极大的性能提升.
函数功能检查
Angular支持IE8+的浏览器(撰写本文时Angular版本是1.2.x), 这意味着它还是要兼容老的浏览器, 为它们提供那些没有的功能. 让我们来用 indexOf
来举例.
function indexOf(array, obj) {if (array.indexOf) return array.indexOf(obj); for (var i = 0; i < array.length; i++) { if (obj === array[i]) return i; } return -1; }
它直接取代了原来的 array.indexOf
方法, 它自己实现了indexOf方法. 但如果浏览器支持这个函数, 他将直接调用原生方法. 十分简单.
闭包
实现闭包可以用一个立即执行函数(IIFE). 比如下面这个 isArray
方法, 如果浏览器不支持这个功能, 它将使用闭包返回一个 Array.isArray
的实现. 如果 Array.isArray
是一个函数, 那么它将直接使用原生方法----又一个提高性能的方法. IIFE可以让我们十分的方便来封装一些东西, 然后只返回我们需要的内容.
var isArray = (function() { if (!isFunction(Array.isArray)) { return function(value) { return toString.call(value) === '[object Array]'; }; } return Array.isArray; })();
这就是我看的第一部分Angular源码, 第二部分将在下周发布.
原文: AngularJS: Looking under the hood [Part 1]
from :http://www.cnblogs.com/woshinidezhu/p/4061964.html
转载于:https://www.cnblogs.com/xuan52rock/p/4781446.html
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 读《VUE2 实践揭秘》
梁睿坤 著 一本我打分为 6 分的书,有的部分非常好,有的地方又感觉讲的不透。让人不清不楚的。 Angular 是什么? https://angularjs.org/ AngularJS [1] 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是…...
2024/4/20 20:12:39 - 3.揭秘angular2学习 ------- 模版
模版 模版是一种自定义的标准化页面,通过模版和模版中的数据结合,可以生成各种各样的网页。几乎所有HTML语法在模版中都是适用的,除了script标签。另外html body base等元素并不起什么作用。 模版语法概览 实例名称说明语法<p>{{ de…...
2024/4/20 12:21:19 - AngularJS 2+ 迅速扫盲
AngularJS 2 迅速扫盲 Angular2 基础学习。概念性扫盲。 本文地址:http://blog.csdn.net/mingyueyixi/article/details/72904657 撰写此文时,AngularJS已经发展到版本4。本文实际上基于AngularJS4。 知识点: 模块 NgModule组件 Component指…...
2024/4/23 2:14:29 - Angular17 Angular自定义指令
1 什么是HTML HTML文档就是一个纯文本文件,该文件包含了HTML元素、CSS样式以及JavaScript代码;HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲染这些DOM节点来呈现内容,用户在浏览器中看…...
2024/4/21 3:07:09 - Angular相关学习资源
1. 官方文档:https://angular.cn/guide/quickstart 2. 项目Github:https://github.com/angular/angular 3. Typescript文档:https://www.tslang.cn/docs/home.html 4. 《迈向Angular2》:https://pan.baidu.com/s/19K1QusMDBRjsE…...
2024/4/21 3:07:09 - Angular 4.x ngModel 双向绑定原理揭秘
在 Angular 4.x 中对于使用 Template-Driven 表单场景,如果需要实现表单数据绑定。我们就需要引入 ngModel 指令。该指令用于基于 domain 模型,创建 FormControl 实例,并将创建的实例绑定到表单控件元素上。 ngModel 使用示例 ngModel app.co…...
2024/4/21 3:07:08 - angular离线部署
离线机子先安装nodejs,官网上下载安装即可。 1、先在联网机子上安装angular/cli包。 2、将全局下的包打包为zip; 路径:C:\Users\Administrator\AppData\Roaming\npm\node_modules\angular 3、拷贝 angular.zip 压缩包到离线机器。 4、离…...
2024/4/21 3:07:07 - angular 读写本地电脑文件
angular 读写本地电脑文件 angular将数据写进到电脑文件 angular读取电脑文件,txt文件,json文件等。 在前端写一个按钮,然后点击按钮的时候在本地电脑保存一个txt文件。 这时候我们需要用到一个angular的插件,叫做“FileSaver.j…...
2024/4/21 3:07:05 - Angular通过FileReader读取文件上传
首先这里说一下这个方式只适合小文件的上传,并且存在弊端,对于大文件参考我的另一篇博客ng2-file-uploadnode.jsexpress实现文件上传并保存本地 首先前台就是通过file类型的input选择文件 <input type"file" (change)"selectFile($ev…...
2024/4/21 3:07:05 - 三、angular6-引入外部文件
1.如引入bootstrap4,先安装bootstrap4 npm install bootstraplatest 2,打开Angular.json页面,在styles中引入css文件,js文件不用引用...
2024/4/21 3:07:03 - Angular 配置文件常见配置注解
前言 Angular CLI项目中的配置文件angular-cli.json 从6.x以后就用angular.json替代了angular-cli.json。 angular.json, 这个文件是整个项目的概要,包含了 不同的环境,测试、代理、第三方资源 和 众多内置工具。 两个版本中的angular.json的项目结构…...
2024/4/21 3:07:02 - Angular下载文件/JS下载文件/把Base64字符串转成文件
在前端下载文件有各种各样的方法, 但如果服务端只返回base64编码的字符串, 或者直接调用js生成各种下载模板, 怎么把base64字符串转化成文件呢? 使用 moonncat/base64tofile 就轻松解决这个难题 //安装 npm install moonncat/base64tofilelatest 然后就可以愉快地在Angular…...
2024/4/21 3:07:01 - Angular文件创建命令
// 生成组件带有模版 ng generate component example 或ng g c example ng generate component example -it 生成内联模版(不会单独生成html文件) ng generate directive my-directive - 生成一个新指令 ng generate pipe my-pipe - 生成一个新管道 …...
2024/4/21 3:07:03 - angular的文件上传
1.ng2FileSelect https://segmentfault.com/a/1190000007886391 官网有demo:https://valor-software.com/ng2-file-upload/ 使用文档:https://www.cnblogs.com/gavin-cn/p/7256852.html 2.Web Uploader http://fex.baidu.com/webuploader/...
2024/4/21 3:07:01 - Spring+ Angularjs 文件下载功能
最近在做一个附件下载的功能,需要使用Angularjs下载文件,贴点代码,希望有用; 1.Spring后端代码 这里上传的文件是存放在某个文件夹目录下的,直接通过将file转换成输入流,然后copy到输出流中即可 FileInputS…...
2024/4/21 3:06:58 - Angular 8 配置文件
项目在开发时与发布后的配置文件(比如url)是有区别的,因此需要根据不同的场景使用不同的配置。 环境 >ng version_ _ ____ _ ___/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|/…...
2024/4/21 3:06:57 - Angular文件上传
一、 使用FormData异步提交 常用的表单提交编码方式有两种:multipart/form-data 和 application/x-www-form-urlencoded,如果是html页面中的form表单上传,可以使用enctype来指定编码方式,不指定时默认是后者。 文件上传必须使用m…...
2024/4/20 4:12:36 - angular中使用a标签在PC端下载文件
<a target"_self" class"balanced" href"{{downloadURL}}{{item.id}}" download"{{item.fileName}}">下载</a> 虽说只有短短一行代码,不过看代码应该都能知道什么作用了。 class属性值是Ionic的颜色&#…...
2024/4/21 3:06:55 - Vue、angular10 post请求接口 下载文件
1、调用后台接口和传参 this.bizCommonConfigService.downLoadExcel(`${this.commonConfig.getTransactionUrl()}/refundOrder/downloadPdf`,params).then(()=>{this.imgName = null }); 2、核心方法downLoadExcel(downloadURl: string, query: any) {const datas = query;…...
2024/4/21 3:06:54 - angular 下载上传excel (xlsx)文件
装包 package 1、xlsx npm install xlsx --save2、file-saver package1、xlsx npm install xlsx --save2、file-savernpm install file-saver --savenpm install file-loader --savenpm install types/file-saver --save...
2024/4/20 20:12:44
最新文章
- 笔记:.NET的框架梳理及相关概念了解(“.NET Core“ “.NET“ “.NET Framework“)
一、.NET设计 架构:C/C程序是直接将源码编译成机器码(CPU可以识别和运行的指令),对于不同CPU,其指令集不同,机器码也就不同,故:C/C程序编译时,需选择具体的CPU架构&…...
2024/4/27 23:33:00 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 【嵌入式开发 Linux 常用命令系列 4.3 -- git add 不 add untracked file】
请阅读【嵌入式开发学习必备专栏 】 文章目录 git add 不add untracked file git add 不add untracked file 如果你想要Git在执行git add .时不添加未跟踪的文件(untracked files),你可以使用以下命令: git add -u这个命令只会加…...
2024/4/25 4:06:17 - ChatGPT 赚钱初学者指南(上)
原文:The Beginner’s Guide to Earning Money Online with ChatGPT 译者:飞龙 协议:CC BY-NC-SA 4.0 第一章:理解基础知识 什么是 ChatGPT? 在人工智能与人类对话相遇的数字织锦中,ChatGPT 作为一个突出…...
2024/4/27 11:05:12 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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