【原创】ui.router源码解析
Angular系列文章之angular路由
路由
(route)
,几乎所有的MVC(VM)
框架都应该具有的特性,因为它是前端构建单页面应用(SPA)
必不可少的组成部分。
那么,对于angular
而言,它自然也有内置
的路由模块:叫做ngRoute
。
不过,大家很少用它,因为它的功能太有限,往往不能满足开发需求!!
于是,一个基于ngRoute
开发的第三方路由模块,叫做ui.router
,受到了大家的“追捧”。
ngRoute vs ui.router
首先,无论是使用哪种路由,作为框架额外的附加功能,它们都将以模块依赖
的形式被引入,简而言之就是:在引入路由源文件
之后,你的代码应该这样写(以ui.router
为例):
angular.module("myApp", ["ui.router"]); // myApp为自定义模块,依赖第三方路由模块ui.router
这样做的目的是:在程序启动(bootstrap)的时候,加载依赖模块(如:ui.router),将所有挂载
在该模块的服务(provider)
,指令(directive)
,过滤器(filter)
等都进行注册,那么在后面的程序中便可以调用了。
说到这里,就得看看ngRoute模块
和ui.router模块
各自都提供了哪些服务,哪些指令?
- ngRoute
- $routeProvider(服务提供者) --------- 对应于下面的urlRouterProvider和stateProvider
- $route(服务) --------- 对应于下面的urlRouter和state
- $routeParams(服务) --------- 对应于下面的stateParams
- ng-view(指令) --------- 对应于下面的ui-view
- ui.router
- $urlRouterProvider(服务提供者) --------- 用来配置路由重定向
- $urlRouter(服务)
- $stateProvider(服务提供者) --------- 用来配置路由
- $state(服务) --------- 用来显示当前路由状态信息,以及一些路由方法(如:跳转)
- $stateParams(服务) --------- 用来存储路由匹配时的参数
- ui-view(指令) --------- 路由模板渲染,对应的dom相关联
- ui-sref(指令)
- ...
(注
:服务提供者:用来提供服务实例和配置服务。)
这样一看,其实ui.router
和ngRoute
大体的设计思路,对应的模块划分都是一致的(毕竟是同一个团队开发),不同的地方在于功能点的实现和增强
。
那么问题来了:ngRoute
弱在哪些方面,ui.router
怎么弥补了这些方面?
这里,列举两个最重要的方面来说(其他细节,后面再说):
- 多视图
- 嵌套视图
多视图
多视图:页面可以显示多个动态变化的不同区块。
这样的业务场景是有的:
比如:页面一个区块用来显示页面状态,另一个区块用来显示页面主内容,当路由切换时,页面状态跟着变化,对应的页面主内容也跟着变化。
首先,我们尝试着用ngRoute
来做:
html
<div ng-view>区块1</div>
<div ng-view>区块2</div>
js
$routeProvider.when('/', {template: 'hello world'});
我们在html中利用ng-view指令定义了两个区块,于是两个div中显示了相同的内容,这很合乎情理,但却不是我们想要的,但是又不能为力,因为,在ngRoute中:
- 视图没有名字进行唯一标志,所以它们被同等的处理。
- 路由配置只有一个模板,无法配置多个。
ok,针对上述两个问题,我们尝试用ui.router
来做:
html
<div ui-view></div><div ui-view="status"></div>
js
$stateProvider.state('home', {url: '/',views: {'': {template: 'hello world'},'status': {template: 'home page'}}});
这次,结果是我们想要的,两个区块,分别显示了不同的内容,原因在于,在ui.router中:
- 可以给视图命名,如:ui-view="status"。
- 可以在路由配置中根据视图名字(如:status),配置不同的模板(其实还有controller等)。
注
:视图名是一个字符串,不可以包含@
(原因后面会说)。
嵌套视图
嵌套视图:页面某个动态变化区块中,嵌套着另一个可以动态变化的区块。
这样的业务场景也是有的:
比如:页面一个主区块显示主内容,主内容中的部分内容要求根据路由变化而变化,这时就需要另一个动态变化的区块嵌套在主区块中。
其实,嵌套视图,在html中的最终表现就像这样:
<div ng-view>I am parent<div ng-view>I am child</div>
</div>
转成javascript,我们会在程序里这样写:
$routeProvider.when('/', {template: 'I am parent <div ng-view>I am child</div>'});
倘若,你真的用ngRoute
这样写,你会发现浏览器崩溃了,因为在ng-view指令link的过程中,代码会无限递归下去。
那么造成这种现象的最根本原因:路由没有明确的父子层级关系!
看看ui.router
是如何解决这一问题的?
$stateProvider.state('parent', {abstract: true,url: '/',template: 'I am parent <div ui-view></div>'}).state('parent.child', {url: '',template: 'I am child'});
- 巧妙地,通过
parent
与parent.child
来确定路由的父子关系
,从而解决无限递归问题。 - 另外子路由的模板最终也将被插入到父路由模板的div[ui-view]中去,从而达到视图嵌套的效果。
ui.router工作原理
路由,大致可以理解为:一个
查找匹配
的过程。
对于前端MVC(VM)
而言,就是将hash值
(#xxx)与一系列的路由规则
进行查找匹配,匹配出一个符合条件的规则,然后根据这个规则,进行数据的获取,以及页面的渲染。
所以,接下来:
- 第一步,学会如何创建路由规则?
- 第二步,了解路由查找匹配原理?
路由的创建
首先,看一个简单的例子:
$stateProvider.state('home', {url: '/abc',template: 'hello world'});
上面,我们通过调用$stateProvider.state(...)
方法,创建了一个简单路由规则,通过参数,可以容易理解到:
- 规则名:'home'
- 匹配的url:'/abc'
- 对应的模板:'hello world'
意思就是说:当我们访问http://xxxx#/abc
的时候,这个路由规则被匹配到,对应的模板会被填到某个div[ui-view]
中。
看上去似乎很简单,那是因为我们还没有深究具体的一些路由配置参数(我们后面再说)。
这里需要深入的是:$stateProvider.state(...)
方法,它做了些什么工作?
- 首先,创建并存储一个state对象,里面包含着该路由规则的所有配置信息。
- 然后,调用
$urlRouterProvider.when(...)
方法,进行路由的注册
(之前是路由的创建),代码里是这样写的:
$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {// 判断是否是同一个state || 当前匹配参数是否相同if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {$state.transitionTo(state, $match, { inherit: true, location: false });}
}]);
上述代码的意思是:当hash值
与state.url
相匹配时,就执行后面那段回调,回调函数里面进行了两个条件判断之后,决定是否需要跳转到该state?
这里就插入了一个话题:为什么说 “跳转到该state,而不是该url”?
其实这个问题跟大家一直说的:“ui.router是基于state(状态)的,而不是url
”是同一个问题。
我的理解是这样的:之前就说过,路由存在着明确的父子关系
,每一个路由可以理解为一个state,
- 当程序匹配到某一个子路由时,我们就认为这个子路由state被激活,同时,它对应的父路由state也将被激活。
- 我们还可以手动的激活某一个state,就像上面写的那样,
$state.transitionTo(state, ...);
,这样的话,它的父state会被激活(如果还没有激活的话),它的子state会被销毁(如果已经激活的话)。
ok,回到之前的路由注册,调用了$urlRouterProvider.when(...)
方法,它做了什么呢?
它创建了一个rule,并存储在rules集合里面,之后的,每次hash值变化,路由重新查找匹配都是通过遍历这个rules
集合进行的。
路由的查找匹配
有了之前,路由的创建和注册,接下来,自然会想到路由是如何查找匹配的?
恐怕,这得从页面加载完毕说起:
- angular 在刚开始的$digest时,
$rootScope
会触发$locationChangeSuccess
事件(angular在每次浏览器hash change的时候也会触发$locationChangeSuccess
事件) - ui.router 监听了
$locationChangeSuccess
事件,于是开始通过遍历一系列rules,进行路由查找匹配 - 当匹配到路由后,就通过
$state.transitionTo(state,...)
,跳转激活对应的state - 最后,完成数据请求和模板的渲染
可以从下面这段源代码看到,看到查找匹配的起始和过程:
function update(evt) {// ...省略function check(rule) {var handled = rule($injector, $location);// handled可以是返回:// 1. 新的的url,用于重定向// 2. false,不匹配// 3. true,匹配if (!handled) return false;if (isString(handled)) $location.replace().url(handled);return true;}var n = rules.length, i;// 渲染遍历rules,匹配到路由,就停止循环for (i = 0; i < n; i++) {if (check(rules[i])) return;}// 如果都匹配不到路由,使用otherwise路由(如果设置了的话)if (otherwise) check(otherwise);
}function listen() {// 监听$locationChangeSuccess,开始路由的查找匹配listener = listener || $rootScope.$on('$locationChangeSuccess', update);return listener;
}if (!interceptDeferred) listen();
那么,问题来了:难道每次路由变化(hash变化),由于监听了’$locationChangeSuccess'事件,都要进行rules的遍历
来查找匹配路由,然后跳转到对应的state吗?
答案是:肯定的,一般的路由器都是这么做的,包括ngRoute。
那么ui.router对于这样的问题,会怎么进行优化
呢?
回归到问题:我们之所以要循环遍历rules,是因为要查找匹配到对应的路由(state),然后跳转过去,倘若不循环,能直接找到对应的state吗?
答案是:可以的。
还记得前面说过,在用ui.router在创建路由时:
- 会实例化一个对应的state对象,并存储起来(states集合里面)
- 每一个state对象都有一个state.name进行唯一标识(如:'home')
根据以上两点,于是ui.router提供了另一个指令叫做:ui-sref指令
,来解决这个问题,比如这样:
<a ui-sref="home">通过ui-sref跳转到home state</a>
当点击这个a标签时,会直接跳转到home state,而并不需要循环遍历rules,ui.router是这样做到的(这里简单说一下):
首先,ui-sref="home"指令会给对应的dom添加click事件
,然后根据state.name,直接跳转到对应的state,代码像这样:
element.bind("click", function(e) {// ..省略若干代码var transition = $timeout(function() {// 手动跳转到指定的state$state.go(ref.state, params, options);});
});
跳转到对应的state之后,ui.router会做一个善后处理,就是改变hash,所以理所当然,会触发’$locationChangeSuccess'事件,然后执行回调,但是在回调中可以通过一个判断代码规避循环rules,像这样:
function update(evt) {var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl;// 手动调用$state.go(...)时,直接return避免下面的循环if (ignoreUpdate) return true;// 省略下面的循环ruls代码
}
说了那么多,其实就是想说,我们不建议直接使用href="#/xxx"来改变hash
,然后跳转到对应state(虽然也是可以的),因为这样做会多了一步rules循环遍历,浪费性能,就像下面这样:
<a href="#/abc">通过href跳转到home state</a>
路由详解
这里详细地介绍ui.router的参数配置和一些深层次用法。
不过,在这之前,需要一个demo,ui.router的官网demo无非就是最好的学习例子,里面涉及了大部分的知识点,所以接下来的代码讲解大部分都会是这里面的(建议下载到本地进行代码学习)。
为了更好的学习这个demo,我画了一张图来描述这个demo的contacts部分各个视图模块,如下:
父与子
之前就说到,在ui.router中,路由就有父与子的关系(多个父与子凑起来就有了,祖先和子孙的关系),从javascript的角度来说,其实就是路由对应的state对象之间存在着某种引用
的关系。
用一张数据结构的表示下contacts部分,大概是这样(原图):
上面的图看着有点乱,不过没关系,起码能看出各个state对象之间通过parent
字段维系了这样一个父与子
的关系(粉红色的线)。
ok,接下来就看下是如何定义路由的父子关系的?
假设有一个父路由,如下:
$stateProvider.state('contacts', {});
ui.router提供了几种方法来定义它的子路由:
1.点标记法(推荐
)
$stateProvider.state('contacts.list', {});
通过状态名
简单明了地来确定父子路由关系,如:状态名为'a.b.c'的路由,对应的父路由就是状态名为'a.b'路由。
2.parent
属性
$stateProvider.state({name: 'list', // 状态名也可以直接在配置里指定parent: 'contacts' // 父路由的状态名});
或者:
$stateProvider.state({name: 'list', // 状态名也可以直接在配置里指定parent: { // parent也可以是一个父路由配置对象(指定路由的状态名即可)name: 'contacts'}});
通过parent
直接指定父路由,可以是父路由的状态名(字符串),也可以是一个包含状态名的父路由配置(对象)。
竟然路由有了父与子
的关系,那么它们的注册顺序有要求嘛?
答案是:没有要求,我们可以在父路由存在之前,创建子路由(不过,不是很推荐),因为ui.router在遇到这种情况时,在内部会帮我们先缓存
子路由的信息,等待它的父路由注册完毕后,再进行子路由的注册。
模板渲染
当路由成功跳转到指定的state时,ui.router会触发'$stateChangeSuccess'
事件通知所有的ui-view
进行模板重新渲染。
代码是这样的:
if (options.notify) {$rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
}
而ui-view
指令在进行link
的时候,在其内部就已经监听了这一事件(消息),来随时更新视图:
scope.$on('$stateChangeSuccess', function() {updateView(false);
});
大体的模板渲染过程就是这样的,这里遇到一个问题,就是:每一个 div[ui-view]
在重新渲染的时候如何获取到对应视图模板的呢?
要想知道这个答案,
首先,我们得先看一下模板如何设置?
一般在设置单视图
的时候,我们会这样做:
$stateProvider.state('contacts', {abstract: true,url: '/contacts',templateUrl: 'app/contacts/contacts.html'});
在配置对象里面,我们用templateUrl
指定模板路径即可。
如果我们需要设置多视图
,就需要用到views字段
,像这样:
$stateProvider.state('contacts.detail', {url: '/{contactId:[0-9]{1,4}}',views: {'' : {templateUrl: 'app/contacts/contacts.detail.html',},'hint@': {template: 'This is contacts.detail populating the "hint" ui-view'},'menuTip': {templateProvider: ['$stateParams', function($stateParams) {return '<hr><small class="muted">Contact ID: ' + $stateParams.contactId + '</small>';}]}}});
这里我们使用了另外两种方式设置模板:
template
:直接指定模板内容,另外也可以是函数返回模板内容templateProvider
:通过依赖注入的调用函数的方式返回模板内容
上述我们介绍了设置单视图
和多视图
模板的方式,其实最终它们在ui.router内部都会被统一格式化成的views
的形式,且它们的key值会做特殊变化:
上述的单视图
会变成这样:
views: {// 模板内容会被安插在根路由模板(index.html)的匿名视图下'@': {abstract: true,url: '/contacts',templateUrl: 'app/contacts/contacts.html'}
}
多视图
会变成这样:
views: {// 模板内容会被安插在父路由(contacts)模板的匿名视图下'@contacts': {templateUrl: 'app/contacts/contacts.detail.html',},// 模板内容会被安插在根路由(index.html)模板的名为hint视图下'hint@': {template: 'This is contacts.detail populating the "hint" ui-view'},// 模板内容会被安插在父路由(contacts)模板的名为menuTip视图下'menuTip@contacts': {templateProvider: ['$stateParams', function($stateParams) {return '<hr><small class="muted">Contact ID: ' + $stateParams.contactId + '</small>';}]}
}
我们会发现views对象里面的key
变化了,最明显的是出现了一个@
符号,其实这样的key值是ui.router的一个设计,它的原型是:viewName + '@' + stateName
,解释下:
viewName
- 指的是
ui-view="status"
中的'status' - 也可以是''(空字符串),因为会有匿名的
ui-view
或者ui-view=""
- 指的是
stateName
- 默认情况下是父路由的
state.name
,因为子路由模板一般都安插在父路由的ui-view
中 - 也可以是''(空字符串),表示最顶层rootState
- 还可以是任意的祖先
state.name
- 默认情况下是父路由的
这样原型的意思是,表示该模板将会被安插在名为stateName路由对应模板的viewName视图下(可以看看上面代码中的注释理解下)。
其实这也解释了之前我说的:“为什么state.name里面不能存在@
符号”?因为@
在这里被用于特殊含义了。
所以,到这里,我们就知道在ui-view
重新进行模板渲染时,是根据viewName + '@' + stateName
来获取对应的视图模板内容(其实还有controller等)的。
其实,由于路由有了父与子
的关系,某种程度上就有了override(覆盖或者重写)可能。
父路由和子路由之间就存在着视图的override,像下面这段代码:
$stateProvider.state('contacts.detail', {url: '/{contactId:[0-9]{1,4}}',views: {'hint@': {template: 'This is contacts.detail populating the "hint" ui-view'} }});$stateProvider.state('contacts.detail.item', {url: '/item/:itemId',views: {'hint@': {template: ' This is contacts.detail.item overriding the "hint" ui-view'} }});
上面两个路由(state)存在着父与子
的关系,且他们都对@hint
定义了视图,那么当子路由被激活时(它的父路由也会被激活),我们应该选择哪个视图配置呢?
答案是:子路由的配置。
具体的,ui.router是如何实现这样的视图override的呢?
简单地回答就是:通过javascript原型链实现的,你可以在每次路由切换成功后,尝试着打印出$state.current.locals
这个变量一看究竟。
还有一个很重要的问题,关乎性能:当我们子路由变化时,页面中所有的ui-view都会重新进行渲染吗?
答案是:不会,只会从子路由对应的视图开始局部重新渲染。
在每次路由变化时,ui.router会记录变化的子路由,并对子路由进行重新的预处理(包括controller,reslove等),最后局部更新对应的ui-view,父路由部分是不会有任何变化的。
controller控制器
有了模板之后,必然不可缺少controller向模板对应的作用域(scope)中填写数据,这样才可以渲染出动态数据。
我们可以为每一个视图添加不同的controller,就像下面这样:
$stateProvider.state('contacts', {abstract: true,url: '/contacts',templateUrl: 'app/contacts/contacts.html',resolve: {'contacts': ['contacts',function( contacts){return contacts.all();}]},controller: ['$scope', '$state', 'contacts', 'utils',function ($scope, $state, contacts, utils) {// 向作用域写数据$scope.contacts = contacts;}]});
注意:controller是可以进行依赖注入
的,它注入的对象有两种:
- 已经注册的服务(service),如:
$state
,utils
- 上面的
reslove
定义的解决项(这个后面来说),如:contacts
但是不管怎样,目的都是:向作用域里写数据。
reslove解决项
resolve在state配置参数中,是一个对象(key-value),每一个value都是一个可以依赖注入的函数,并且返回的是一个promise(当然也可以是值,resloved defer)。
我们通常会在resolve中,进行数据获取的操作,然后返回一个promise,就像这样:
resolve: {'contacts': ['contacts',function( contacts){return contacts.all();}]}
上面有好多contacts,为了不混淆,我改一下代码:
resolve: {'myResolve': ['contacts',function(contacts){return contacts.all();}]}
这样就看清了,我们定义了resolve,包含了一个myResolve的key,它对应的value是一个函数,依赖注入了一个服务contacts,调用了contacts.all()
方法并返回了一个promise。
于是我们便可以在controller中引用myResolve,像这样:
controller: ['$scope', '$state', 'myResolve', 'utils',function ($scope, $state, contacts, utils) {// 向作用域写数据$scope.contacts = contacts;
}]
这样做的目的:
- 简化了controller的操作,将数据的获取放在resolve中进行,这在多个视图多个controller需要相同数据时,有一定的作用。
- 只有当reslove中的promise全部resolved(即数据获取成功)后,才会触发
'$stateChangeSuccess'
切换路由,进而实例化controller,然后更新模板。
另外,子路由的resolve或者controller都是可以依赖注入父路由的resolve提供的数据服务,就像这样:
$stateProvider.state('parent', {url: '',resolve: {parent: ['$q', '$timeout', function ($q, $timeout) {var defer = $q.defer();$timeout(function () {defer.resolve('parent');}, 1000);return defer.promise;}]},template: 'I am parent <div ui-view></div>'}).state('parent.child', {url: '/child',resolve: {child: ['parent', function (parent) { // 调用父路由的解决项return parent + ' and child';}]},controller: ['child', 'parent', function (child, parent) { // 调用自身的解决项,以及父路由的解决项console.log(child, parent);}],template: 'I am child'});
另外每一个视图也可以单独定义自己的resolve和controller,它们也是可以依赖注入自身的state.resolve,或者view下的resolve,或者父路由的reslove,就像这样:
html
<div ui-view></div><div ui-view="status"></div>
javascript:
$stateProvider.state('home', {url: '/home',resolve: { common: ['$q', '$timeout', function ($q, $timeout) { // 公共的resolvevar defer = $q.defer();$timeout(function () {defer.resolve('common data');}, 1000);return defer.promise;}],},views: {'': {resolve: {special: ['common', function (common) { // 访问state.resolveconsole.log(common);}]}},'status': {resolve: {common: function () { // 重写state.resolvereturn 'override common data'}},controller: ['common', function (common) { // 访问视图自身的resolveconsole.log(common);}]}}});
总结一下:
- 路由的controller除了可以依赖注入正常的service,也可以依赖注入resolve
- 子路由的resolve可以依赖注入父路由的resolve,也可以重写父路由的resolve供controller调用
- 路由可以有单独的state.resolve之外,还可以在views视图中单独配置resolve,视图resolve是可以依赖注入自身state.resolve甚至是父路由的state.resolve
结束语
以上就是我看过源代码后,对ui.router的一些理解,以及对难懂的知识点的一些分析,如果有错误,还请指出,有不清楚的,欢迎留言,新浪微博 - Lovesueee。
转载于:https://www.cnblogs.com/lovesueee/p/4442509.html
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 做美瞳线可以做双眼皮吗
...
2024/4/28 3:39:42 - ngRoute 与ui.router区别
angular路由 路由 (route) ,几乎所有的 MVC(VM) 框架都应该具有的特性,因为它是前端构建单页面应用 (SPA) 必不可少的组成部分。 那么,对于 angular 而言,它自然也有 内置 的路由模块:叫做 ngRoute 。 不过,…...
2024/4/28 0:16:34 - 双眼皮设计器多少厘米
...
2024/4/27 21:48:24 - jQuery的DOM操作
基本操作:增删改查。 前端开发中,基本就是对DOM进行操作,简略分成设计、逻辑、DOM操作方法三大块。其中DOM操作方法必须了解增删改查。 在jQuery出现前的时代,仅仅使用javaScript来操作DOM是一种非常辛苦的事情,而jQ…...
2024/4/21 12:44:34 - angularJS的DOM操作
AngularJs是不直接操作DOM的,但是在平时的开发当中,我们有的时候还是需要操作一些DOM的,如果使用原生的JS的话操作过于麻烦,所以大家一般都是使用jQuery,jQuery虽然好用,但是AngularJs是不建议和JQuery同时…...
2024/4/28 13:55:21 - 开全切双眼皮能去掉吗
...
2024/4/28 17:10:12 - 双眼皮手术后能正常上班
...
2024/4/28 4:48:24 - 前端面试题个人总结
一、HTML 1、html5的新特性有哪些? (1)新的文档类型 (New Doctype) <!DOCTYPE html>; (2)脚本和链接无需写属性type (No More Types for Scripts and Links): type"text/css…...
2024/4/28 19:34:26 - 双眼皮后后去上班
...
2024/4/27 14:02:35 - javascript面试题
原文链接:http://www.3mooc.com/front/articleinfo/198 1,介绍js的基本数据类型。 Undefined、Null、Boolean、Number、String 2,介绍js有哪些内置对象? Object 是 JavaScript 中所有对象的父对象 数据封装类对象:…...
2024/4/27 20:43:40 - 计划出色的用户体验的3个步骤
用户体验(UX)是设计产品(在本例中为软件程序或应用程序)的过程,以便它们为最终用户提供有意义且相关的体验。 在“ UX之父”唐诺曼(Don Norman)发表他的著作《日常事物的设计 》之后,…...
2024/4/27 16:08:45 - Vue从浅及深全面概述
### Vue > Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧a…...
2024/4/27 20:10:02 - 一大波vue的福利来了、、、
Vue Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS&…...
2024/4/27 2:46:53 - Vue的相关知识点
Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vue1.0悄悄的问世了,它的优雅&…...
2024/4/27 21:07:03 - 深圳北大医院韩式三点韩式综合双眼皮图片
...
2024/4/27 19:00:20 - 双眼皮开眼角方式
...
2024/4/27 15:38:54 - 在线安装html/jsp/xml editor插件(非常可靠)
在线安装eclipse中html/jsp/xml editor插件(非常可靠),eclipseeditor之前有一篇文章也是安装eclipse中的web开发插件 ,但是经过很多人使用,那种方法,不是所有人使用都可以。 接下来,找到一种非常管用的方法,就是在线安装。 废话不多说,这种方法绝对可以安装成功。 1.打…...
2024/4/27 15:53:00 - JS(总结)
基础 Javascript是一种弱类型语言,它分别有什么优点和缺点 弱类型语言:简单好用,更灵活多变。但是会牺牲性能,比如一些隐含的类型转换 强类型语言:类型转换的时候非常严格,,强类型语言是直接操纵…...
2024/4/27 17:12:22 - 割的双眼皮和刚刚做完埋线双眼皮的图片
...
2024/4/27 17:21:58 - 微创妈妈给滴双眼皮需要定型吗
...
2024/4/27 13:45:48
最新文章
- 设计模式学习笔记 - 开源实战五(中):如何利用职责链与代理模式实现Mybatis Plugin
概述 上篇文章对 Mybatis 框架做了简单的背景介绍,并通过对比各种 ORM 框架,学习了代码的易用性、性能、灵活性之间的关系。一般来讲,框架提供的高级功能越多,那性能损耗就越大;框架使用起来越简单,那灵活…...
2024/4/28 20:22:04 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 校园局域网钓鱼实例
Hello ! 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全,设计的钓鱼案例也是怎么简陋怎么来 注:本文不会外传代码,后端已停止使用,仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…...
2024/4/26 1:15:21 - git总结
建议配合gitlab实操 git分区:工作区(修改的地方),暂存区(add),本地仓库(commit) 常用命令 初次使用配置 git config --global user.name "xxx" git config --global user.email "xxxqq.com" 这2个是针对整个主机的全局…...
2024/4/26 0:33:49 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/28 13:52:11 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到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/28 13:51:37 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/28 15:57:13 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业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