本文主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的内容。如:Angular多级依赖注入、ViewContainerRef,Portals可以翻译为 门户 ,我觉得放到这里叫 入口 更好,可以理解为动态创建组件的入口,类似于小程序或者Vue中的Slot.

cdk全名Component Development Kit 组件开发包,是Angular官方在开发基于Material Design的组件库时抽象出来单独的一个开发包,里面封装了一些开发组件时的公共逻辑并且跟Material Design 设计无关,可以用来封装自己的组件库或者直接在业务开发中使用,里面代码抽象程度非常高,非常值得学习,现在我用到的有Portals、Overlay(打开浮层相关)、SelectionModel、Drag and Drop等.
官方:https://material.angular.io/
中文翻译:https://material.angular.cn

动态创建组件

想想应用的路由,一般配置路由地址的时候都会给这个地址配置一个入口组件,当匹配到这个路由地址的时候就在指定的地方渲染这个组件,动态创建组件类似,在最页面未接收到用户行为的时候,我不知道页面中这块区域应该渲染那个组件,当页面加载时根据数据库设置或者用户的操作行为才能确定最终要渲染的组件,这时候就要用代码动态创建组件把目标组件渲染到正确的地方。
示例截图
image.png

使用Angular API动态创建组件

该路由的入口组件是PortalsEntryConponent组件,如上面截图所示右侧有一块虚线边框的区域,里面具体的渲染组件不确定。

第一步

先在视图模板中定义一个占位的区域,动态组件就要渲染在这个位置,起一个名称#virtualContainer
文件portals-entry.component.html

<div class="portals-outlet" ><ng-container #virtualContainer></ng-container>
</div>

第二步

通过ViewChild取到这个container对应的逻辑容器
文件portals-entry.component.ts

 @ViewChild('virtualContainer', { read: ViewContainerRef })virtualContainer: ViewContainerRef;

第三步

处理单击事件,单击按钮时动态创建一个组件,portals-entry.component.ts完整逻辑

import { TaskDetailComponent } from '../task/task-detail/task-detail.component';
@Component({selector: 'app-portals-entry',templateUrl: './portals-entry.component.html',styleUrls: ['./portals-entry.component.scss'],providers: []
})
export class PortalsEntryComponent implements OnInit {@ViewChild('virtualContainer', { read: ViewContainerRef })virtualContainer: ViewContainerRef;constructor(private dynamicComponentService: DynamicComponentService,private componentFactoryResolver: ComponentFactoryResolver,private injector: Injector,) { }ngOnInit() {}openTask() {const task = new TaskEntity();task.id = '1000';task.name = '写一篇关于Portals的文章';const componentFactory = this.componentFactoryResolver.resolveComponentFactory(TaskDetailComponent);const componentRef = this.virtualContainer.createComponent<TaskDetailComponent>(componentFactory,null,this.virtualContainer.injector);(componentRef.instance as TaskDetailComponent).task = task; // 传递参数}
} 

代码说明

  1. openTask()方法绑定到模板中按钮的单击事件
  2. 导入要动态创建的组件TaskDetailComponent
  3. constructor注入injector、componentFactoryResolver 动态创建组件需要的对象,只有在组件上下文中才可以拿到这些实例对象
  4. 使用api创建组件,现根据组件类型创建一个ComponentFactory对象,然后调用viewContainer的createComponent创建组件
  5. 使用componentRef.instance获取创建的组件实例,这里用来设置组件的task属性值

其它

ViewContainerRef除了createComponent方法外还有一个createEmbeddedView方法,用于创建模板

@ViewChild('customTemplate')
customTemplate: TemplateRef<any>;
this.virtualContainer.createEmbeddedView(this.customTemplate, { name: 'pubuzhixing' }); 

createEmbeddedView方法的第二个参数,用于指定模板的上下文参数,看下模板定义及如何使用参数

<ng-template #customTemplate let-name="name"><p>自定义模板,传入参数name:{{name}}</p>
</ng-template> 

此外还可以通过ngTemplateOutlet直接插入内嵌视图模板,通过ngTemplateOutletContext指定模板的上下文参数

<ng-container [ngTemplateOutlet]="customTemplate" [ngTemplateOutletContext]="{ name:'pubuzhixing' }"></ng-container>

小结

分析下Angular动态创建组件/内嵌视图的API,动态创建组件首先需要一个被创建的组件定义或模板声明,另外需要Angular上下文的环境来提供这个组件渲染在那里以及这个组件的依赖从那获取,viewContainerRef是动态组件的插入位置并且提供组件的逻辑范围,此外还需要单独传入依赖注入器injector,示例直接使用逻辑容器的injector,是不是很好理解。
示例仓储:https://github.com/pubuzhixing8/angular-cdk-demo

CDK Portal 官方文档介绍

这里先对Portal相关的内容做一个简单的说明,后面会有两个使用示例,本来这块内容准备放到最后的,最终还是决定放在前面,可以先对Portals有一个简单的了解,如果其中有翻译不准确请见谅。
地址:https://material.angular.io/cdk/portal/overview

-------- 文档开始
portals 提供渲染动态内容到应用的可伸缩的实现,其实就是封装了Angular动态创建组件的过程

Portals

这个Portal指是能动态渲染一个指定位置的 UI块 到页面中的一个 open slot
UI块 指需要被动态渲染的内容,可以是一个组件或者是一个模板,而 open slot 是一个叫做PortalOutlet的开放的占位区域。
Portals和PortalOutlets是其它概念中的低级的构造块,像overlays就是在它基础上构建的

 Portal<T> 包括动态组件的抽象类,可以是TemplatePortal(模板)或者ComponentPortal(组件)
方法描述
attach(PortalOutlet): T把当前Portal附加到宿主上
detach(): void把Portal从宿主上拆离
isAttached: boolean当前Portal是否已经附加到宿主上
 PortalOutlet 动态组件的宿主
方法描述
attach(Portal): any附加指定Portal
detach(): any拆离当前附加Portal
dispose(): void永久释放宿主资源
hasAttached: boolean当前是否已经装在Portal

代码片段说明

CdkPortal

 <ng-template cdkPortal><p>The content of this template is captured by the portal.</p>
</ng-template>
<!-- OR -->
<!-- 通过下面的结构指令语法可以得到同样的结果 -->
<p *cdkPortal>The content of this template is captured by the portal.
</p> 

可以通过ViewChild、ViewChildren获取到该Portal,类型应该是CdkPortal,如下所示:

 // 模板中的Portal
@ViewChild(CdkPortal) templateCDKPortal: TemplatePortal<any>; 

ComponentPortal
组件类型的Portal,需要当前组件在NgModule的entryComponents中配置才能动态创建该组件。

 this.userSettingsPortal = new ComponentPortal(UserSettingsComponent); 

CdkPortalOutlet
使用指令可以把portal outlet添加到一个ng-template,cdkPortalOutlet把当前元素指定为PortalOutlet,下面代码把userSettingsPortal绑到此portal-outlet上

  <!-- Attaches the `userSettingsPortal` from the previous example. -->
<ng-template [cdkPortalOutlet]="userSettingsPortal"></ng-template>  

----- 文档完毕

** Portals使用示例**

这里首先使用新的api完成和最上面示例一样的需求,在同样的位置动态渲染TaskDetailComponent组件。

第一步

同样是设置一个宿主元素用于渲染动态组件,可以使用指令cdkPortalOutlet挂载一个PortalOutlet在这个ng-container元素上

<div class="portals-outlet"><ng-container #virtualContainer cdkPortalOutlet></ng-container>
</div>

第二步

使用Angular API动态创建组件 一节使用同一个逻辑元素作为宿主,只不过这里的获取容器的类型是CdkPortalOutlet,代码如下

@ViewChild('virtualContainer', { read: CdkPortalOutlet })
virtualPotalOutlet: CdkPortalOutlet;

第三步

创建一个ComponentPortal类型的Portal,并且将它附加上面获取的宿主virtualPotalOutlet上,代码如下

  portalOpenTask() {this.virtualPotalOutlet.detach();const taskDetailCompoentPortal = new ComponentPortal<TaskDetailComponent>(TaskDetailComponent);const ref = this.virtualPotalOutlet.attach(taskDetailCompoentPortal);// 此处同样可以 通过ref.instance传递task参数}

小结

这里是使用ComponentPortal的示例实现动态创建组件,Portal还有一个子类TemplatePortal是针对模板实现的,上节 CDK Portal 官方文档介绍 中有介绍,这里就不在赘述了。总之使用Portals可以很大程度上简化代码逻辑。
示例仓储:https://github.com/pubuzhixing8/angular-cdk-demo

Portals 源码分析

上面只是使用Portal的最简单用法,下面讨论下它的源码实现,以便更好的理解

ComponentPortal

首先我们先看一下ComponentPortal类的创建,上面的例子只是指定了一个组件类型作为参数,其实它还有别的参数可以配置,先看下ComponentPortal的构造函数定义

export class ComponentPortal<T> extends Portal<ComponentRef<T>> {   constructor(component: ComponentType<T>,viewContainerRef?: ViewContainerRef | null,injector?: Injector | null,componentFactoryResolver?: ComponentFactoryResolver | null) {super();this.component = component;this.viewContainerRef = viewContainerRef;this.injector = injector;this.componentFactoryResolver = componentFactoryResolver;} 
}

ComponentPortal构造函数的另外两个参数 viewContainerRefinjector
viewContainerRef 参数非必填默认附到PortalOutlet上,如果传入viewContainerRef参数,那么ComponentPortal就会附到该viewContaierRef上,而不是当前PortalOutlet所在的元素上。
injector 参数非必填,默认使用PortalOutlet所在的逻辑容器的injector,如果传入injector,那么动态创建的组件就使用传入的injector作为注入器。

** BasePortalOutlet**

BasePortalOutlet提供了附加ComponentPortal和TemplatePortal的部分实现,我们看下attach方法的部分代码(仅仅展示部分逻辑)

  /** Attaches a portal. */attach(portal: Portal<any>): any {if (!portal) {throwNullPortalError();}if (portal instanceof ComponentPortal) {this._attachedPortal = portal;return this.attachComponentPortal(portal);} else if (portal instanceof TemplatePortal) {this._attachedPortal = portal;return this.attachTemplatePortal(portal);}throwUnknownPortalTypeError();} 

attach处理前先根据Portal的类型是确实是组件还是模板,然后再进行相应的处理,其实最终还是调用了ViewContainerRef的createComponent或者createEmbeddedView方法,对这块感兴趣看查看源代码文件portal-directives.ts。

** DomPortalOutlet**

DomPortalOutlet可以把一个Portal插入到一个Angular应用上下文之外的DOM中,想想我们前面的例子,无论自己实现还是使用CdkPortalOutlet都是把一个模板或者组件插入到一个Angular上下文中的宿主ViewContainerRef中,而DomPortalOutlet就是 脱离Angular上下文 的宿主,可以把Portal渲染到任意dom中,我们常常有这种需求,比如弹出的模态框、Select浮层。
在cdk中Overlay用到了DomPortalOutlet,然后material ui的MatMenu也用到了DomPortalOutlet,MatMenu比较容易理解,简单看下它是如何创建和使用的DomPortalOutle(查看全部)

if (!this._outlet) {this._outlet = new DomPortalOutlet(this._document.createElement('div'),this._componentFactoryResolver, this._appRef, this._injector);
}
const element: HTMLElement = this._template.elementRef.nativeElement;
element.parentNode!.insertBefore(this._outlet.outletElement, element);
this._portal.attach(this._outlet, context);

上面的代码先创建了DomPortalOutlet类型的对象_outlet,DomPortalOutlet是一个DOM宿主它不在Angular的任何一个ViewContainerRef中,现在看下它的四个构造函数参数

参数名类型说明
outletElementElement创建的document元素
_componentFactoryResolverComponentFactoryResolver刚开始一直不理解这个实例对象是干什么的,后来查了资料,它大概的作用是对要创建的组件或者模板进行编译
_appRefApplicationRef当前Angular应用的一个关联对象
_defaultInjectorInjector注入器对象

说明:这节讲的 脱离Angular上下文 是不太准确定,任何模板或者组件都不能脱离Angular的运行环境,这里应该是脱离了实际渲染的Component Tree,单独渲染到指定dom中。

复杂示例

为ComponentPortal传入PortalInjector对象,PortalInjector实例对象配置一个其它业务组件的injector并且配置tokens,下面简单说明下逻辑结构,有兴趣的可看完整示例。

业务组件TaskListComponent

文件task-list.component.ts

@Component({,selector: 'app-task-list',templateUrl: './task-list.component.html',styleUrls: ['./task-list.component.scss'],providers: [TaskListService]
})
export class TaskListComponent implements OnInit {constructor(public taskListService: TaskListService) {}
} 

组件级提供商配置了TaskListService

定义TaskListService

用于获取任务列表数据,并保存在属性tasks中

TaskListComponent模板

在模板中直接绑定taskListService.tasks属性数据

修改父组件PortalsEntryComponent

因为PortalOutlet是在父组件中,所以单击任务列表创建动态组件的逻辑是从父组件响应的
portals-entry.component.ts

   @ViewChild('taskListContainer', { read: TaskListComponent })taskListComponent: TaskListComponent; ngOnInit() {this.taskListComponent.openTask = task => {this.portalCreatTaskModel(task);};}
portalCreatTaskModel(task: TaskEntity) {this.virtualPotalOutlet.detach();const customerTokens = new WeakMap();customerTokens.set(TaskEntity, task);const portalInjector = new PortalInjector(this.taskListViewContainerRef.injector,customerTokens);const taskModelCompoentPortal = new ComponentPortal<TaskModelComponent>(TaskModelComponent,null,portalInjector);this.virtualPotalOutlet.attach(taskModelCompoentPortal);}

给ComponentPortal的构造函数传递了PortalInjector类型的参数portalInjector,PortalInjector继承自Injector

PortalInjector构造函数的两个参数

  1. 第一个参数是提供一个基础的注入器injector,这里使用了taskListViewContainerRef.injector,taskListViewContainerRef就是业务TaskListComponent组件的viewContainerRef
   @ViewChild('taskListContainer', { read: ViewContainerRef })taskListViewContainerRef: ViewContainerRef; 

也就是新的组件的注入器来自于TaskListComponent
2. 第二个参数是提供一个tokens,类型是WeakMap,其实就是key/value的键值对,只不过它的key只能是引用类型的对象,这里把类型TaskEntity作为key,当前选中的实例对象作为value,就可以实现对象的传入,使用set方法customerTokens.set(TaskEntity, task);

新的任务详情组件TaskModelComponent

task-model.component.ts

  constructor(public task: TaskEntity,private taskListService: TaskListService) {}

没错,是通过注入器注入的方式获取TaskEntity实例和服务TaskListService的实例taskListService。

** 小结**

这个例子相对复杂,只是想说明可以给动态创建的组件传入特定的injector。

总结

想写Portals的使用主要是看了我们组件库中模态框ThyDialog的实现,觉得这些用法比较巧妙,所以想分享出来。
示例仓储:https://github.com/pubuzhixing8/angular-cdk-demo
组件库仓储:https://github.com/worktile/ngx-tethys

拓展

ViewContainerRef

angula.cn解释:表示可以将一个或多个视图附着到组件中的容器,可以包含宿主视图(当用 createComponent() 方法实例化组件时创建)和内嵌视图(当用 createEmbeddedView() 方法实例化 TemplateRef 时创建)。
我这里的理解ViewContainerRef是Angular中的一个逻辑单元,简单理解它与组件或者页面中的html元素一一对应只是逻辑形态不同,它也有层级只是层级与组件树的层级不是一一对应,这点个人感觉有些难理解,就拿Portals里面ComponentPortal的实现来说,构造函数里面可以传入一个viewContainerRef,代码片段

/*** A `ComponentPortal` is a portal that instantiates some Component upon attachment.*/
export class ComponentPortal<T> extends Portal<ComponentRef<T>> {/*** [Optional] Where the attached component should live in Angular's *logical* component tree.* 可选参数 关联的组件应该寄宿的逻辑组件树的位置* This is different from where the component *renders*, which is determined by the PortalOutlet.* 这跟组件真正渲染的位置是不同的,真正的位置由PortalOutlet决定* The origin is necessary when the host is outside of the Angular application context.* 当宿主是在Angular上下文环境之外这个参数是必填项*/viewContainerRef?: ViewContainerRef | null;constructor(component: ComponentType<T>,viewContainerRef?: ViewContainerRef | null,injector?: Injector | null,componentFactoryResolver?: ComponentFactoryResolver | null) {// ...}
}

对其中viewContainerRef的注释进行了简单的翻译,但还是不知道它是怎么实现逻辑组件树与真实渲染组件树设置不同层级,经过自己的尝试当设置viewContainerRef后,组件就渲染在了传入的viewContainerRef里面。
属性 elementinjector
** element ** 的类型是ElementRef,用来标识本容器在父容器中的位置与html中的元素一一对应
** injector ** 的类型是Injector,它是容器的一个依赖注入器对象,我们在组件的constructor中注入的服务以及获取关联的对象都要通过它来查找,在ViewContainer的逻辑树中注入器对象有一个 注入器冒泡 机制,当一个组件申请获得一个依赖时,Angular 先尝试用该组件容器自己的注入器来满足它,在该组件的容器中找不到实例并且也没有配置注入器提供商(providers),他就会在把这个申请转给它父组件的注入器来处理。所以在动态创建组件的时候可以单独配置这个injector可以子组件传递数据、共享实例对象。

WeakMap

最初因为不了解WeakMap而对这个实现疑惑不解,查了WeakMap的相关资料

WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键名必须是对象,而值可以是任意的。
键名是对象的弱引用,当对象被回收后,WeakMap自动移除对应的键值对,WeakMap结构有助于防止内存泄漏。
可以与Map对比理解,Map中key可以是各种类型,而WeakMap必须是对象。
这样WeakMap就可以用来在不修改原引用类型对象的基础上,而扩充该对象的属性值,并且不影响引用类型对象的垃圾回收,随该对象的消失,扩充属性随之消失。

Worktile官网: https://worktile.com/

本文作者:杨振兴
文章首发于「Worktile官方博客」,转载请注明来源。

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

相关文章

  1. angular6升级到angular7

    官网上有教程。https://update.angular.io/ 我相当于翻译验证一下 1.首先需要单独升级rxjs。运行 npm i -g rxjs-tslint 和 rxjs-5-to-6-migrate -p src/tsconfig.app.json 2.删除\node_modules\tslint-language-service。 3.运行 ng update angular/cli angular/core …...

    2024/4/23 3:45:13
  2. Angular 数据绑定

    Angular 数据绑定 Angular 数据绑定数据绑定事件绑定属性绑定HTML属性绑定双向绑定 响应式编程管道大小写转换管道日期管道小数管道货币管道自定义管道 数据绑定 <h1>{{productTitlt}}!</h1> 使用插值表达式将一个表达式的值显示在模版上。 <img [src] &q…...

    2024/4/21 16:35:21
  3. 进行用户验证用Angular 4和Flask【翻译】

    内容列表 Auth WorkflowProject SetupAuth ComponentBootstrap StyleAuth ServiceSanity CheckUser LoginUser Registration Server-side SetupSanity CheckAuth LoginAuth RegisterLocal StorageUser StatusRoute RestrictionWhat’s Next?在这篇文章中&#xff0c;我们将示…...

    2024/4/21 2:28:33
  4. 深入理解Angular作用域

    翻译自&#xff1a;Understanding Scopes 摘要 在AngularJS中&#xff0c;子作用域通常会原型继承于其父作用域。有一个例外是当指令使用scope: { ... }来定义&#xff0d;&#xff0d;这创建了一个没有原型继承的“独立“作用域&#xff0c;这会在创建“可重复使用的组件“的…...

    2024/4/20 5:39:26
  5. Angular2 基本的模板语法

    Angular2 模板语法 ##插值表达式 {{...}} <p>My name is {{user.name}}</p><h3>{{title}}<img src"{{heroImageUrl}}" style"height:30px"> </h3><!-- "The sum of 1 1 is 2" --> <p>The sum of 1…...

    2024/4/21 2:28:31
  6. angular 动画 query用法

    query API 翻译 function query(selector: string, animation: AnimationMetadata | AnimationMetadata[], options: AnimationQueryOptions | null null): AnimationQueryMetadata; 描述 query是一个动画特效function被用于angular的动画DSL领域语言 query()被用于找到当…...

    2024/4/21 2:28:29
  7. Angular 8.x使用ViewChild报错

    错误&#xff1a; error TS2554: Expected 2 arguments, but got 1. 应有 2 个参数&#xff0c;但获得 1 个。ts(2554) core.d.ts(7888, 47): An argument for opts was not provided. 原因&#xff1a;ViewChild需要两个参数&#xff0c;并没有提供opts 官网解释&#xff…...

    2024/4/20 3:09:37
  8. angular引入模板报错解决

    用ng-include指令引入一个html文件&#xff0c;结果报错如下&#xff1a; angular.min.js:103 XMLHttpRequest cannot load file:///D:/www/angular/review/template.html. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-exten…...

    2024/4/28 9:40:12
  9. 将选择元素绑定到Angular中的对象

    本文翻译自&#xff1a;Binding select element to object in AngularId like to bind a select element to a list of objects -- which is easy enough: 我想将select元素绑定到对象列表-这很容易&#xff1a; Component({selector: myApp,template: <h1>My Applicat…...

    2024/4/26 4:52:15
  10. 1、Angular整体概述

    这系列文章都是通过大漠孤烟的视频教程整理而来&#xff0c;挂个翻译标签不会被说什么侵权吧&#xff01; 一、集成开发环境angular/cli 开发angular项目时需要哪些node模块呢&#xff1f;angular/cli&#xff1a; - webpack - TS - Karma 单元测试 - Jasmine 单元测试 -…...

    2024/4/20 20:24:08
  11. AngularJS - angular-translate 国际化插件

    配置 1.安装依赖 npm install angular-translate -snpm install angular-translate-loader-static-files -s 2.在html中加载JS ‘node_modules/angular-translate/dist/angular-translate.min.js’,‘node_modules/angular-translate-loader-static-files/angular-translat…...

    2024/4/20 20:24:08
  12. Angular8项目中遇到的问题

    1. 2021/7/7 because its MIME type (text/html) is not a supported stylesheet MIME type, and strict MIME checkin出现的背景&#xff1a;新创建了个页面无法通过路径访问&#xff0c;但可以通过this.router.navigate([’/apple-email’], { queryParams: params });跳转进…...

    2024/4/20 20:24:07
  13. angular2 利用路由制作breadcrumb面包屑

    原文地址 Angular2 Breadcrumb using Router 在web领域 面包屑依旧是ui导航的必备元素之一&#xff0c;我们将用angular的Router来制作一个breadcrumb面包屑 Demo Check out my demo plunker: https://plnkr.co/edit/aNEoyZ?ppreview Router 首先 让我们快速浏览一下app.…...

    2024/4/20 20:24:06
  14. 前端:Angular框架与Ionic框架集成Html翻译pipe(管道)

    在前端开发的时候经常会遇到页面显示的内容有HTML标记。默认是没有经过翻译的。集成翻译管道就可以正常显示内容。由于Angular与ionic集成的方法有点不&#xff0c;所以分开写。 一、Angular框架集成pipe 1、新建一个管道 新建命令&#xff1a;ng g pipe pipe/tohtml tohtml…...

    2024/4/21 2:28:26
  15. angular-seed的官方文档翻译

    译者按&#xff1a;博主一直喜欢用intellij IDEA来做前端的事情&#xff0c;是因为上面有很多辅助开发的插件都已经准备好了&#xff0c;完全不用怎么配置&#xff0c;而且很多插件可以从一开始就帮你新建成一个结构完整的项目&#xff0c;包括各种测试工具&#xff0c;依赖库文…...

    2024/4/21 2:28:25
  16. 【angular】@Directive

    在 Angular中有三种类型的指令directive&#xff1a; 组件Component — 拥有模板的指令,我们在另外一文已专门学习过啦。本文就不涉及改指令的内容了。 结构型指令 — 通过添加和移除 DOM 元素改变 DOM 布局的指令。例如&#xff0c;*NgFor 和 *NgIf。你可能注意到了指令名的…...

    2024/4/21 2:28:23
  17. Angular指令学习-简单介绍

    1.ng-app ng-app指令是用来告诉应用程序当前元素是根元素&#xff1b;所有的Angular应用程序都必须要有一个根元素&#xff1b;一个html文档中只能有一个ng-app指令&#xff0c;如果出现多个ng-app指令&#xff0c;应用程序只会执行第一个&#xff0c;若想让除了第一个以外的ng…...

    2024/4/21 2:28:22
  18. angular常用自定义的组件指令

    详情 ng-template、ng-content、ng-container https://blog.csdn.net/hsany330/article/details/53038246 AngularJS 最常用的八种功能...

    2024/4/21 2:28:21
  19. Angular 自定义指令 repeatFinish 向控制器传递消息

    <div class"swiper-slide" ng-repeat"item in jysInfo" repeat-finish></div> app.directive(repeatFinish,function () {return {link:function (scope) {if(scope.$last true){setTimeout(function () {//向父控制器传递事件消息scope.$em…...

    2024/4/24 12:23:40
  20. Angular文件上传及$http介绍

    Angular中$http介绍 在angular.js 1.6版本之后&#xff0c;删除了.success和.error方法&#xff0c;而使用.then。 此处基于Angular1的最后版本。 $http配置选项 $http(config).then()&#xff0c;根据官方文档&#xff0c;常用的有以下配置选项&#xff1a; method → htt…...

    2024/4/23 0:40:44

最新文章

  1. ESP32 烧录固件

    第一步&#xff1a;下载固件 git clone --recursive https://github.com/espressif/esp-at.git 第二步&#xff1a;执行编译 在该目录执行 python build.py install 如图&#xff1a; 第三步&#xff1a;选择芯片 输入2 第四步&#xff1a;选择固件 输入1 第五步&#…...

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

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

    2024/3/20 10:50:27
  3. 【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

    目录 前言 什么是面向对象&#xff1f; 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 前言 最早的C版本&#xff08;C with classes&#xff09;中&#xff0c;最先加上的就是类的机制&#xff0c;它构成…...

    2024/5/1 13:18:37
  4. 字符串匹配算法之BF与KMP算法

    目录 BF算法(暴力匹配算法) KMP算法 核心思想&#xff1a; next数组 next数组的优化 BF算法(暴力匹配算法) #include <assert.h> int BF(const char* str, const char* sub) {assert(str ! NULL && sub ! NULL);if (str NULL || sub NULL){return -1;}int…...

    2024/5/2 2:35:56
  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/3 23:10:03
  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/5/4 2:59:34
  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