最终产品图片
您将要创造的

这是“ Angular 4中的表单简介”系列的第二部分。在第一部分中,我们使用模板驱动的方法创建了一个表单。 我们使用了ngModelngModelGroupngForm等指令来ngModel表单元素。 在本教程中,我们将采用另一种方法来构建表单-反应性方法。

反应形式

与模板驱动的表单相比,反应性表单采用不同的方法。 在这里,我们在组件类中创建并初始化表单控件对象 。 它们是保存表单状态的中间对象。 然后,我们将它们绑定到模板中的表单控件元素

表单控件对象侦听输入控制值的任何更改,并且它们会立即反映在对象的状态中。 由于组件可以直接访问数据模型结构,因此所有更改都可以在数据模型,表单控制对象和输入控制值之间同步。

使用模型驱动的方法对响应式表单进行高级概述

实际上,如果我们正在构建用于更新用户配置文件的表单,则数据模型是从服务器检索的用户对象。 按照约定,这通常存储在组件的用户属性( this.user )中。 表单控件对象或表单模型将绑定到模板的实际表单控件元素。

这两个模型即使不相同,也应具有相似的结构。 但是,输入值不应直接流入数据模型。 该图像描述了用户从模板输入的信息如何进入表单模型。

让我们开始吧。

先决条件

您无需遵循本系列的第一部分,而使第二部分有意义。 但是,如果您不熟悉Angular中的表单,我强烈建议您采用模板驱动策略。 我的GitHub存储库中提供了该项目的代码。 确保您位于正确的分支上,然后下载zip或克隆存储库以查看正在使用的表单。

如果您想从头开始,请确保已安装Angular CLI。 使用ng命令生成一个新项目。

$ ng new SignupFormProject

接下来,为SignupForm生成一个新组件或手动创建一个组件。

ng generate component SignupForm

用以下内容替换app.component.html的内容:

<app-signup-form> </app-signup-form>

这是src /目录的目录结构。 我删除了一些不必要的文件,以使事情变得简单。

.
├── app
│   ├── app.component.css
│   ├── app.component.html
│   ├── app.component.ts
│   ├── app.module.ts
│   ├── signup-form
│   │   ├── signup-form.component.css
│   │   ├── signup-form.component.html
│   │   └── signup-form.component.ts
│   └── User.ts
├── index.html
├── main.ts
├── polyfills.ts
├── styles.css
├── tsconfig.app.json
└── typings.d.ts

如您所见, SignupForm组件的目录已自动创建。 那就是我们大多数代码的去向。 我还创建了一个新的User.ts来存储我们的User模型。

HTML模板

在深入研究实际的组件模板之前,我们需要对要构建的内容有一个抽象的想法。 这就是我脑海中的表单结构。 注册表单将具有几个输入字段,一个select元素和一个checkbox元素。

HTML模板

这是我们将用于注册页面HTML模板。

HTML模板

<div class="row custom-row"><div class= "col-sm-5 custom-container jumbotron"><form class="form-horizontal"><fieldset><legend>SignUp</legend><!--- Email Block ---><div class="form-group"><label for="inputEmail">Email</label><input type="text"id="inputEmail"placeholder="Email"></div><!--- Password Block ---><div class="form-group"><label for="inputPassword">Password</label><input type="password" id="inputPassword"placeholder="Password"></div><div class="form-group"><label for="confirmPassword" >Confirm Password</label><input type="password" id="confirmPassword"placeholder="Password"></div><!--- Select gender Block ---><div class="form-group"><label for="select">Gender</label><select id="select"><option>Male</option><option>Female</option><option>Other</option></select></div><!--- Terms and conditions Block ---><div class="form-group checkbox"><label><input type="checkbox"> Confirm that you've read the Terms and Conditions</label></div><!--- Buttons Block ---><div class="form-group"><button type="reset" class="btn btn-default">Cancel</button><button type="submit" class="btn btn-primary">Submit</button></div></fieldset></form></div>
</div>

HTML模板中使用CSS类是用于使外观漂亮的Bootstrap库的一部分。 由于这不是设计教程,因此除非有必要,否则我不会谈论表单CSS方面。

基本表格设置

要创建Reactive表单,您需要从@angular/forms导入ReactiveFormsModule并将其添加到app.module.ts中的imports数组中。

app / app.module.ts

// Import ReactiveFormsModule
import { ReactiveFormsModule } from '@angular/forms';@NgModule({..//Add the module to the imports Arrayimports: [BrowserModule,ReactiveFormsModule..
})
export class AppModule { }

接下来,为注册表单创建一个用户模型。 我们可以使用类或接口来创建模型。 对于本教程,我将导出具有以下属性的类。

app / User.ts

export class User {id: number;email: string;//Both the passwords are in a single objectpassword: { pwd: string;confirmPwd: string;};gender: string;terms: boolean;constructor(values: Object = {}) {//Constructor initializationObject.assign(this, values);}}

现在,在SignupForm组件中创建User模型的实例。

app / signup-form / signup-form.component.ts

import { Component, OnInit } from '@angular/core';
// Import the User model
import { User } from './../User';@Component({selector: 'app-signup-form',templateUrl: './signup-form.component.html',styleUrls: ['./signup-form.component.css']
})
export class SignupFormComponent implements OnInit {//Gender list for the select control elementprivate genderList: string[];//Property for the userprivate user:User;ngOnInit() {this.genderList =  ['Male', 'Female', 'Others'];}

对于signup-form.component.html文件,我将使用上面讨论的相同HTML模板,但会有一些细微变化。 注册表单具有一个带有选项列表的选择字段。 尽管这ngFor ,但我们将通过使用ngFor指令遍历列表来以Angular方式进行ngFor

app / signup-form / signup-form.component.html

<div class="row custom-row"><div class= "col-sm-5 custom-container jumbotron"><form class="form-horizontal"><fieldset><legend>SignUp</legend>
.
.<!--- Gender Block --><div class="form-group"><label for="select">Gender</label><select id="select"><option *ngFor = "let g of genderList" [value] = "g"> {{g}} </option></select></div>
.
.</fieldset></form></div>
</div>

注意:您可能会收到一条错误消息,指出 没有为ControlContainer提供程序 当组件具有不带formGroup指令的<form>标记时,将出现错误。 一旦在本教程的后面添加了FormGroup指令,该错误将消失。

我们手边有一个组件,一个模型和一个表单模板。 现在怎么办? 现在是时候让我们变脏了,熟悉创建反应式表单所需的API。 这包括FormControlFormGroup

使用FormControl跟踪状态

使用反应式表单策略构建表单时,您不会遇到ngModel和ngForm指令。 相反,我们使用基础的FormControl和FormGroup API。

FormControl是用于创建FormControl实例的指令,可用于跟踪特定表单元素的状态及其验证状态。 这是FormControl的工作方式:

/* Import FormControl first */
import { FormControl } from '@angular/forms';/* Example of creating a new FormControl instance */
export class SignupFormComponent {email = new FormControl();
}

email现在是一个FormControl实例,您可以将其绑定到模板中的输入控件元素,如下所示:

<h2>Signup</h2><label class="control-label">Email:<input class="form-control" [formControl]="email">
</label>

现在,模板表单元素已绑定到组件中的FormControl实例。 这意味着对输入控制值的任何更改都会反映在另一端。

FormControl构造函数接受三个参数-初始值,同步验证器数组和异步验证器数组-正如您可能已经猜到的,它们都是可选的。 我们将在这里讨论前两个论点。

import { Validators } from '@angular/forms';
.
.
.
/* FormControl with initial value and a validator */email = new FormControl('bob@example.com', Validators.required);

Angular具有一组有限的内置验证器。 流行的验证器方法包括Validators.requiredValidators.minLengthValidators.maxlengthValidators.pattern 。 但是,要使用它们,必须首先导入Validator API。

对于我们的注册表单,我们有多个输入控制字段(用于电子邮件和密码),一个选择器字段和一个复选框字段。 而不是创建单个FormControl对象,将所有这些FormControl归为一个实体更有意义吗? 这是有益的,因为我们现在可以在一处跟踪所有子FormControl对象的值和有效性。 那就是FormGroup目的。 因此,我们将使用多个子FormControl注册一个父FormGroup。

使用FormGroup将多个FormControl分组

要添加FormGroup,请首先将其导入。 接下来,将signupForm声明为类属性,并按如下所示对其进行初始化:

app / signup-form / signup-form.component.ts

//Import the API for building a form
import { FormControl, FormGroup, Validators } from '@angular/forms';export class SignupFormComponent implements OnInit {genderList: String[];signupForm: FormGroup;..ngOnInit() {this.genderList =  ['Male', 'Female', 'Others'];this.signupForm = new FormGroup ({email: new FormControl('',Validators.required),pwd: new FormControl(),confirmPwd: new FormControl(),gender: new FormControl(),terms: new FormControl()})}
}

如下所示将FormGroup模型绑定到DOM:

app / signup-form / signup-form.component.html

<form class="form-horizontal"  [formGroup]="signupForm" ><fieldset><legend>SignUp</legend><!--- Email Block --><div class="form-group"><label for="inputEmail">Email</label><input type="text" formControlName = "email"id="inputEmail"placeholder="Email">..</fieldset></form>

[formGroup] = "signupForm"告诉Angular您想将此表单与组件类中声明的FormGroup关联。 当Angular看到formControlName="email" ,它将检查父FormGroup中具有键值email的FormControl实例。

同样,通过添加formControlName="value"属性来更新其他表单元素,就像我们在这里所做的那样。

若要查看是否一切正常,请在form标记后添加以下内容:

app / signup-form / signup-form.component.html

<!--- Log the FormGroup values to see if the binding is working --><p>Form value {{ signupForm.value | json }} </p><p> Form status {{ signupForm.status | json}} </p>

通过JsonPipe传递SignupForm属性,以在浏览器中将模型呈现为JSON。 这对于调试和记录很有帮助。 您应该看到这样的JSON输出。

模型驱动表单中的表单状态和有效性

这里有两件事要注意:

  1. JSON与我们之前创建的用户模型的结构不完全匹配。
  2. signupForm.status显示表单的状态为INVALID。 这清楚地表明,电子邮件控制字段上的Validators.required可以正常工作。

表单模型和数据模型的结构应匹配。

// Form model{ "email": "", "pwd": "", "confirmPwd": "", "gender": "", "terms": false 
}//User model
{"email": "","password": { "pwd": "","confirmPwd": "",},"gender": "","terms": false
}

为了获得数据模型的层次结构,我们应该使用嵌套的FormGroup。 此外,在单个FormGroup下具有相关的表单元素总是一个好主意。

嵌套表格组

为密码创建一个新的FormGroup。

app / signup-form / signup-form.component.ts

this.signupForm = new FormGroup ({email: new FormControl('',Validators.required),password: new FormGroup({pwd: new FormControl(),confirmPwd: new FormControl()}),gender: new FormControl(),terms: new FormControl()})

现在,要将新表单模型与DOM绑定,请进行以下更改:

app / signup-form / signup-form.component.html

<!--- Password Block --><div formGroupName = "password"><div class="form-group"><label for="inputPassword">Password</label><input type="password" formControlName = "pwd"id="inputPassword"placeholder="Password"></div><div class="form-group"><label for="confirmPassword" >Confirm Password</label><input type="password" formControlName = "confirmPwd"id="confirmPassword"placeholder="Password"></div></div>

formGroupName = "password"对嵌套的FormGroup执行绑定。 现在,表单模型的结构符合我们的要求。

Form value: { "email": "", "password": { "pwd": null, "confirmPwd": null }, "gender": null, "terms": null }Form status "INVALID"

接下来,我们需要验证表单控件。

验证表格

我们已经对电子邮件输入控件进行了简单的验证。 但是,这还不够。 这是我们验证要求的完整列表。

  • 所有表单控制元素都是必需的
  • 禁用提交按钮,直到表单状态为VALID。
  • 电子邮件字段应严格包含电子邮件ID。
  • 密码字段的最小长度为8。
验证表格

第一个很简单。 将Validator.required添加到表单模型中的所有FormControls中。

app / signup-form / signup-form.component.ts

this.signupForm = new FormGroup ({email: new FormControl('',Validators.required),password: new FormGroup({pwd: new FormControl('', Validators.required),confirmPwd: new FormControl('', Validators.required)}),gender: new FormControl('', Validators.required),//requiredTrue so that the terms field isvalid only if checkedterms: new FormControl('', Validators.requiredTrue)})

接下来,在表单无效时禁用按钮。

app / signup-form / signup-form.component.html

<!--- Buttons Block --><div class="form-group"><button type="reset" class="btn btn-default">Cancel</button><button type="submit" [disabled] = "!signupForm.valid" class="btn btn-primary">Submit</button></div>

要对电子邮件添加约束,您可以使用默认的Validators.email或创建一个自定义的Validators.pattern()来指定正则表达式,例如以下表达式:

email: new FormControl('',[Validators.required, Validators.pattern('[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$')])

minLength验证器用于密码字段。

password: new FormGroup({pwd: new FormControl('', [Validators.required, Validators.minLength(8)]),confirmPwd: new FormControl('', [Validators.required, Validators.minLength(8)])}),

验证就可以了。 但是,表单模型逻辑显得混乱且重复。 让我们先清理一下。

使用FormBuilder重构代码

Angular为您提供了一个语法糖,用于创建称为FormBuilder的FormGroup和FormControl的新实例。 除了我们在这里介绍的内容外,FormBuilder API并没有做任何特别的事情。

它简化了我们的代码,并使构建表单的过程更加轻松。 要创建FormBuilder,必须将其导入signup-form.component.ts并将FormBuilder注入构造函数。

app / signup-form / signup-form.component.ts

import { FormBuilder, FormGroup, Validators } from '@angular/forms';
.
.
export class SignupFormComponent implements OnInit {signupForm: FormGroup; // Declare the signupForm //Inject the formbuilder into the constructorconstructor(private fb:FormBuilder) {}ngOnInit() {...}}

而不是创建一个新的FormGroup() ,我们使用this.fb.group来构建一个表单。 除语法外,其他所有内容均保持不变。

app / signup-form / signup-form.component.ts

ngOnInit() {...this.signupForm  = this.fb.group({email: ['',[Validators.required,Validators.pattern('[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$')]],password: this.fb.group({pwd: ['', [Validators.required, Validators.minLength(8)]],confirmPwd: ['', [Validators.required,Validators.minLength(8)]]}),gender: ['', Validators.required],terms: ['', Validators.requiredTrue]})
}

显示验证错误

为了显示错误,我将在div元素上使用条件指令ngIf 。 让我们从电子邮件的输入控制字段开始:

<!-- Email error block -->
<div *ngIf="signupForm.controls.email.invalid && signupForm.controls.email.touched"Email is invalid
</div>

这里有几个问题。

  1. invalidpristine来自何处?
  2. signupForm.controls.email.invalid太长太深。
  3. 该错误没有明确说明为什么无效。

为了回答第一个问题,每个FormControl都具有某些属性,例如invalidvalidpristinedirtytoucheduntouched 。 我们可以使用它们来确定是否应该显示错误消息或警告。 下图详细描述了每个属性。

Angular反应方法中的FormControl属性

因此,仅当电子邮件无效时,才会显示带有*ngIf的div元素。 但是,即使在他们有机会编辑表单之前,也会给用户带来关于输入字段为空白的错误消息。

为了避免这种情况,我们添加了第二个条件。 仅在访问控件后才会显示错误。

为了摆脱方法名称的长链( signupForm.controls.email.invalid ),我将添加几个速记方法。 这使它们更易于访问和简短。

app / signup-form / signup-form.component.ts

export class SignupFormComponent implements OnInit {
...get email() { return this.signupForm.get('email'); }get password() { return this.signupForm.get('password'); }get gender() { return this.signupForm.get('gender'); }get terms() { return this.signupForm.get('terms'); }}

为了使错误更明确,我在下面添加了嵌套的ngIf条件:

app / signup-form / signup-form.component.html

<!-- Email error block --><div *ngIf="email.invalid && email.touched"class="col-sm-3 text-danger"><div *ngIf = "email.errors?.required">Email field can't be blank</div><div *ngIf = "email.errors?.pattern">The email id doesn't seem right</div></div>

我们使用email.errors来检查所有可能的验证错误,然后以自定义消息的形式将其显示给用户。 现在,对其他表单元素执行相同的步骤。 这是我对密码和术语输入控件的验证进行编码的方式。

app / signup-form / signup-form.component.html

<!-- Password error block --><div *ngIf="(password.invalid && password.touched)"class="col-sm-3 text-danger">Password needs to be more than 8 characters</div>.
.
.<!--- Terms error block --><div *ngIf="(terms.invalid && terms.touched)"class="col-sm-3 text-danger">Please accept the Terms and conditions first.</div></div>

使用ngSubmit提交表单

我们几乎完成了表格。 它缺少我们即将实现的提交功能。

<form class="form-horizontal"  [formGroup]="signupForm" (ngSubmit)="onFormSubmit()" >

在提交表单时,表单模型值应流入组件的用户属性。

app / signup-form / signup-form.component.ts

public onFormSubmit() {if(this.signupForm.valid) {this.user = this.signupForm.value;console.log(this.user);/* Any API call logic via services goes here */}}

包起来

如果您从一开始就一直关注本教程系列,那么我们将对Angular中的两种流行的表单构建技术有实际经验。 模板驱动和模型驱动技术是实现同一目标的两种方法。 就我个人而言,出于以下原因,我更喜欢使用反应形式:

  • 所有表单验证逻辑都将位于组件类内部的单个位置。 与ngModel指令分散在整个模板中的模板方法相比,这种方法的生产率更高。
  • 与模板驱动的表单不同,模型驱动的表单更易于测试。 您不必借助端到端测试库来测试您的表单。
  • 验证逻辑将进入组件类而不是模板。
  • 对于具有大量表单元素的表单,此方法具有一个称为FormBuilder的东西,可以简化FormControl对象的创建。

我们错过了一件事,那就是写一个密码不匹配的验证器。 在本系列的最后一部分,我们将介绍在Angular中创建自定义验证器函数所需的所有知识。 敬请期待。

同时,有许多框架和库让您不忙,在Envato Market上有很多项目可供阅读,研究和使用。

翻译自: https://code.tutsplus.com/tutorials/introduction-to-forms-in-angular-4-reactive-forms--cms-29787

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

相关文章

  1. Angular2学习笔记.4、表单相关,双向数据绑定,HeroForm

    开始 本次我们将会学会如何用Angular创建表单、two-way data binding(双向数据绑定)、change tracking(检测变化)、validation(验证) 和 error handling(错误处理)等功能以及ngModel、ngControl和ngForm等指令的应用。 这次内容比较长&#xff0c;在最后会给出一个完成的工程…...

    2024/5/7 22:04:20
  2. AngularDart4.0 指南- 表单

    2019独角兽企业重金招聘Python工程师标准>>> 表单是商业应用程序的主流。您可以使用表单登录&#xff0c;提交帮助请求&#xff0c;下订单&#xff0c;预订航班&#xff0c;安排会议&#xff0c;并执行无数其他数据录入任务。 在开发表单时&#xff0c;创建一个数据…...

    2024/4/21 4:29:12
  3. 细说 Angular 2+ 的表单(一):模板驱动型表单 (自义验证,实用、赞)

    原文出处&#xff1a;https://m.imooc.com/article/details?article_id19902 &#xff08;应该是《Angular从零到一》作者&#xff09; 延伸阅读&#xff1a;Angular 4 自定义验证指令 &#xff08;对“密码一致验证”&#xff0c;做了更详尽的解说&#xff0c;赞&#xff09;…...

    2024/4/21 4:29:11
  4. angular表单验证笔记篇

    一&#xff0c;angular基础指令&#xff08;笔记见本地新加卷盘&#xff09; na-mode指令。 <body ng-app"myApp"><!-- 简单部署ngmyApp&#xff0c; --><input ng-model"name"><div class"red">{{name}}</div>…...

    2024/5/7 22:29:59
  5. Angular2 响应式表单验证

    响应式表单使用ReactiveFormsModule&#xff0c;而非普通的FormModule,需要在app.module.ts里导入 import { ReactiveFormsModule} from angular/forms;NgModule({declarations: [...],exports:[AppComponent],imports: [BrowserModule,...ReactiveFormsModule],providers: []…...

    2024/5/7 19:24:08
  6. Angular引入百度地图js

    第一步&#xff1a;申请百度地图密钥&#xff0c;很简单&#xff0c;去网上随便找教程 第二步&#xff1a;在Angular项目中引入百度地图API文件&#xff0c;在index.html中引入 第三部&#xff0c;创建一个组件 html部分 <div id "map" style"width:100%…...

    2024/4/21 4:29:07
  7. angular js 对象转jquery对象

    和jquery一起使用...

    2024/5/3 7:40:20
  8. AngularJS与Angular的区别

    指同一事物&#xff0c;版本的区别&#xff0c;叫法不同 Angular2.0之前的版本&#xff08;1.x&#xff09;叫做AngularJS 1.x的使用是引入AngularJS的js文件到网页。 2.0之后&#xff0c;就是完全不同了。 Angular2.x与Angular1.x 的区别类似 Java 和 JavaScript 或者说是…...

    2024/5/2 16:27:33
  9. Angular引入自己写的js或者其他

    第一&#xff0c;在tsconfig.json设置compilerOptions的allowJs属性为true; 第二&#xff0c;在index.html页面加入要引用的js&#xff1b;如 < script src“assets/js/suibian.js”></ script>; 第三&#xff0c;直接使用方法即可使用。...

    2024/5/2 17:15:47
  10. angular的html引入js,在AngularJS中的文件夹中加载JavaScript和CSS文件

    AngularJS不支持你想要的东西,但是你可以看看Grunt或Gulp等构建工具,它们可以让你“构建”你的应用程序.在您的情况下,这些工具可以查找CSS文件并将它们连接成一个文件.这样,如果您添加新模块,则index.html不必更改.我个人使用GulpJS,因为它看起来要快得多.我发现配置更容易&am…...

    2024/5/2 18:46:24
  11. Angular export class AppComponent里定义变量的实现原理

    我在Angular项目的app.component.ts使用export class定义了一个Component&#xff0c;在大括号里声明了一个title属性(property)&#xff1a; 这个TypeScript转换成对应的JavaScript文件的源代码如下图所示&#xff1a; 在Chrome开发者工具里的webpack文件夹下&#xff0c;可以…...

    2024/5/2 17:01:26
  12. taro1/2及taro3实现原理

    taro1/2 taro1/2 是编译类型的小程序跨平台框架。 taro是使用react进行小程序构建的。 React 与小程序之间最大的差异就是他们的模板了&#xff0c;在 React 中&#xff0c;是使用 JSX 来作为组件的模板的&#xff0c;而小程序则是使用字符串模板的。 1、模版转换 taro首…...

    2024/4/21 4:29:03
  13. 简析Vue中的MVVM实现原理

    1. MVVM angular - 脏值检测 vue - 数据劫持发布订阅模式&#xff08;不兼容低版本&#xff1a;因为其依赖于Object.defineProperty&#xff09; 2. Object.defineProperty() 1.1 概念 Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改…...

    2024/4/21 4:29:01
  14. Angular jasmine spyOn函数的实现原理

    例子&#xff1a; 语义&#xff1a;希望service.findFirstFocusable方法被监控&#xff0c;同时其调用之后&#xff0c;返回el变量。 输入参数1&#xff1a;MockkeyboardFocusService输入参数2&#xff1a;字符串findFirstFocusable 这两个参数去调用spyRegistry.spyOn方法。 …...

    2024/4/20 19:48:20
  15. MVVM的实现原理

    1.MVVM是什么&#xff1f; 响应式&#xff0c;双向数据绑定&#xff0c;即MVVM。是指数据层&#xff08;Model&#xff09;-视图层&#xff08;View&#xff09;-数据视图&#xff08;ViewModel&#xff09;的响应式框架。它包括&#xff1a; 1.修改View层&#xff0c;Model对…...

    2024/5/2 17:42:11
  16. Angular jasmine单元测试框架里describe的实现原理

    源代码&#xff1a;describe函数传入的两个参数&#xff1a;描述信息和箭头函数&#xff1a; 从注释能看出&#xff0c;describe函数的语义&#xff1a;Create a group of specs (often called a suite) getJasmineRequireObj().interface function(jasmine, env) {var jasmi…...

    2024/4/24 1:54:35
  17. 用最简单的代码实现angular的路由守卫

    目录简述CanActivate&#xff1a;要求认证CanDeActivate&#xff1a;处理未保存的更改github代码示例简述 ng的文档不得不说写的很好很全&#xff0c;但就是这个很好很全对入门要求很高&#xff0c;我其实只需要有份最简单的代码示例先把功能跑起来就可以了&#xff0c;至于原…...

    2024/4/20 10:01:59
  18. Angular getOrCreateInjectable的实现原理调试

    入口&#xff1a;GreetingService是我在Angular项目里定义的abstract service&#xff0c;没有加上Injectable注解&#xff1a; return this._r3Injector.get(token, notFoundValue, injectFlags); this的source为AppModule&#xff0c;records map里已经包含了70个元素&#x…...

    2024/4/21 4:28:59
  19. angular.js实现数据双向通信的原理

    angular.js实现数据双向通信的原理 angular的核心特性有&#xff1a;MVVM、模块化、依赖注入、自动化双向数据绑定、语义标签等。 1、AngularJS的scopes对象 AngularJS的scopes对象&#xff0c;是一般的javascript对象&#xff0c;可以在他们上面绑定属性和其他对象&#xff0c…...

    2024/4/21 4:28:59
  20. Angular jasmine returnValue方法的实现原理

    一个实际的例子&#xff1a; 首先创建一个闭包函数this.plan&#xff0c;存储传入的期望返回值。this.plan是SpyStrategy的一部分。 紧接着返回spied wrapper函数&#xff0c;方便链式调用&#xff1a; callThrough的意思是&#xff0c;仍然监控函数的执行&#xff0c;只是wrap…...

    2024/5/2 10:03:38

最新文章

  1. 在Linux中,标准I/O和文件I/O有什么区别

    在Linux操作系统中&#xff0c;标准I/O&#xff08;标准输入输出&#xff09;和文件I/O&#xff08;文件输入输出&#xff09;是两种常见的数据读写方式&#xff0c;它们在使用目的和实现方式上有所区别&#xff1a; 标准I/O&#xff1a; 定义&#xff1a;标准I/O是一种使用标准…...

    2024/5/7 23:16:01
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/7 10:36:02
  3. java的gradle,maven工程中使用selenium

    一、下载selenium库 &#xff08;1&#xff09;gradle工程 工程中会有一个build.gradle.kts的文件&#xff0c;这个文件可以定制 Gradle 的行为 在文件中添加下面代码&#xff0c;然后sync // implementation ("org.seleniumhq.selenium:selenium-java:4.19.1") …...

    2024/5/5 1:15:36
  4. 动态规划刷题(算法竞赛、蓝桥杯)--饥饿的奶牛(线性DP)

    1、题目链接&#xff1a;饥饿的奶牛 - 洛谷 #include <bits/stdc.h> using namespace std; const int N3000010; vector<int> a[N];//可变数组vector存区间 int n,mx,f[N]; int main(){scanf("%d",&n);for(int i1;i<n;i){int x,y;scanf("%…...

    2024/5/7 17:16:20
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/7 5:50:09
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

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

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

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

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

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

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

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

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

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

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

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

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

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

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

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

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

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/5/4 23:54:56
  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