angular html原理,Angular 4.x ngModel 双向绑定原理揭秘
在 Angular 4.x 中对于使用 Template-Driven 表单场景,如果需要实现表单数据绑定。我们就需要引入 ngModel 指令。该指令用于基于 domain 模型,创建 FormControl 实例,并将创建的实例绑定到表单控件元素上。
ngModel 使用示例
ngModel
app.component.ts
@Component({
selector: 'exe-app',
template: `
Name:
{{ f.value | json }}
`,
})
export class AppComponent implements OnInit { }
在
表单中使用 ngModel 时,我们需要设置一个 name 属性,以便该控件可以使用该名称在表单中进行注册。单向绑定 - [ngModel]
app.component.ts
@Component({
selector: 'exe-app',
template: `
Name:
{{ user | json }}
`,
})
export class AppComponent implements OnInit {
user: { username: string };
ngOnInit() {
this.user = { username: 'Semlinker' };
}
}
双向绑定 - [(ngModel)]
表单中应用
app.component.ts
@Component({
selector: 'exe-app',
template: `
Name:
{{ user | json }}
`,
})
export class AppComponent implements OnInit {
user: { username: string };
ngOnInit() {
this.user = { username: 'Semlinker' };
}
}
单独应用
import { Component } from '@angular/core';
@Component({
selector: 'exe-app',
template: `
{{username}}
`,
})
export class AppComponent {
username: string;
}
ngModelOptions - [ngModelOptions]
当你在使用 ngModel 时未设置 name 属性,如下所示:
Name:
当你运行时,浏览器控制台将会抛出以下异常信息:
Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
以上异常信息告诉我们,如果在表单标签中使用 ngModel,则必须设置 name 属性,或者在 ngModelOptions 中必须将表单控件定义为 "standalone"。依据上述异常信息,我们做如下调整:
Name:
[ngModelOptions]="{standalone: true}">
接下来我们看一下 ngModelOptions 支持的对象类型:
@Input('ngModelOptions') options: {name?: string, standalone?: boolean};
禁用控件 - disabled
Name:
[(ngModel)]="user.username" disabled="true">
监听 ngModelChange 事件 - (ngModelChange)
app.component.ts
@Component({
selector: 'exe-app',
template: `
Name:
[(ngModel)]="user.username">
{{ user | json }}
`,
})
export class AppComponent implements OnInit {
user: { username: string };
ngOnInit() {
this.user = { username: 'Semlinker' };
}
userNameChange(name: string) {
console.log(name);
}
}
获取关联的 NgModel 对象
app.component.ts
@Component({
selector: 'exe-app',
template: `
Name:
[(ngModel)]="user.username">
{{ userName.control | json }}
`,
})
export class AppComponent implements OnInit {
user: { username: string };
ngOnInit() {
this.user = { username: 'Semlinker' };
}
}
通过使用 userName="ngModel" 方式,我们可以获取表单控件关联的 NgModel 对象,进而获取控件当前控件的相关信息,如控件的当前的状态或控件验证信息等。
完整示例
import { Component } from '@angular/core';
import { NgForm } from '@angular/forms';
@Component({
selector: 'exe-app',
template: `
Submit
First name value: {{ first.value }}
First name valid: {{ first.valid }}
Form value: {{ f.value | json }}
Form valid: {{ f.valid }}
`,
})
export class AppComponent {
onSubmit(f: NgForm) {
console.log(f.value); // { first: '', last: '' }
console.log(f.valid); // false
}
}
ngModel 指令详解
ngModel 指令定义
@Directive({
selector: '[ngModel]:not([formControlName]):not([formControl])',
providers: [formControlBinding],
exportAs: 'ngModel'
})
formControlBinding 定义
export const formControlBinding: any = {
provide: NgControl,
useExisting: forwardRef(() => NgModel)
};
相关说明
selector 中 [ngModel]:not([formControlName]):not([formControl]) 表示该指令只应用于 Template-Driven 表单中。
exportAs - 表示可以使用 first="ngModel" 语法获取 NgModel 对象
ngModel 指令输入与输出属性
输入属性
@Input() name: string;
@Input('disabled') isDisabled: boolean;
@Input('ngModel') model: any;
@Input('ngModelOptions') options: {name?: string, standalone?: boolean};
输出属性
@Output('ngModelChange') update = new EventEmitter();
NgModel 类
// angular2/packages/forms/src/directives/ng_model.ts
export class NgModel extends NgControl implements OnChanges,
OnDestroy {
/** @internal */
_control = new FormControl(); // 创建FormControl对象
/** @internal */
_registered = false; // 用于标识控件是否已注册
viewModel: any; // 用于保存前一次model的值
...
}
NgModel 构造函数
constructor(
@Optional() @Host() parent: ControlContainer,
@Optional() @Self() @Inject(NG_VALIDATORS) validators: Array,
@Optional() @Self() @Inject(NG_ASYNC_VALIDATORS) asyncValidators:
Array,
@Optional() @Self() @Inject(NG_VALUE_ACCESSOR)
valueAccessors: ControlValueAccessor[]) {
super();
this._parent = parent;
this._rawValidators = validators || [];
this._rawAsyncValidators = asyncValidators || [];
this.valueAccessor = selectValueAccessor(this, valueAccessors);
}
相关说明
@Optional() - 表示该依赖对象是可选的
@Host() - 表示从宿主元素注入器获取依赖对象
@Self() - 表示从当前注入器获取依赖对象
@Inject() - 用于注入 Token (new InjectionToken) 对应的非 Type 类型依赖对象
构造函数执行的操作:
获取 ControlContainer (控件容器)对象
获取控件上的同步验证器
获取控件上的异步验证器
获取控件上的 ControlValueAccessor
NgModel 生命周期钩子
ngOnChanges
ngOnChanges(changes: SimpleChanges) {
this._checkForErrors();
if (!this._registered) this._setUpControl();
if ('isDisabled' in changes) {
this._updateDisabled(changes);
}
if (isPropertyUpdated(changes, this.viewModel)) {
this._updateValue(this.model);
this.viewModel = this.model;
}
}
_checkForErrors()
private _checkForErrors(): void {
if (!this._isStandalone()) {
this._checkParentType();
}
this._checkName();
}
// 判断是否设置standalone属性
private _isStandalone(): boolean {
return !this._parent || (this.options && this.options.standalone);
}
/**
* 1.ngModel指令不能与formGroupName或formArrayName指令一起使用,需改用
* formControlName或调整ngModel的父控件使用的指令为ngModelGroup。
*
* 2.ngModel不能被注册到使用formGroup指令的表单中,需改用formControlName或设置
* ngModelOptions对象中的standalone属性,避免注册该控件。
*/
private _checkParentType(): void {
if (!(this._parent instanceof NgModelGroup) &&
this._parent instanceof AbstractFormGroupDirective) {
TemplateDrivenErrors.formGroupNameException();
} else if (!(this._parent instanceof NgModelGroup) &&
!(this._parent instanceof NgForm)) {
TemplateDrivenErrors.modelParentException();
}
}
/**
* 验证是否设置name属性
*
* 如果在表单标签中使用 ngModel,则必须设置 name 属性,或者在ngModelOptions中必须将
* 表单控件定义为"standalone"。
*
*
* true}">
*/
private _checkName(): void {
if (this.options && this.options.name) this.name = this.options.name;
if (!this._isStandalone() && !this.name) {
TemplateDrivenErrors.missingNameException();
}
}
_setUpControl()
// 初始化控件
private _setUpControl(): void {
this._isStandalone() ? this._setUpStandalone() :
// 在ControlContainer所属的form中注册该控件
this.formDirective.addControl(this);
this._registered = true; // 标识已注册
}
// 若设置standalone属性,则初始化该控件,并更新控件的值和验证状态
private _setUpStandalone(): void {
setUpControl(this._control, this);
this._control.updateValueAndValidity({emitEvent: false});
}
// 获取ControlContainer所属的form
get formDirective(): any {
return this._parent ? this._parent.formDirective : null;
}
_updateDisabled()
若设置 isDisabled 输入属性,则更新控件的 disabled 属性:
// 更新控件的disabled状态
private _updateDisabled(changes: SimpleChanges) {
// 获取disabled输入属性的当前值
const disabledValue = changes['isDisabled'].currentValue;
// 判断是否设置为disabled
const isDisabled = disabledValue === '' ||
(disabledValue && disabledValue !== 'false');
resolvedPromise.then(() => {
if (isDisabled && !this.control.disabled) {
this.control.disable(); // 禁用控件
} else if (!isDisabled && this.control.disabled) {
this.control.enable(); // 启用控件
}
});
}
isPropertyUpdated()
// 判断属性是否更新
export function isPropertyUpdated(changes: {[key: string]: any},
viewModel: any): boolean {
if (!changes.hasOwnProperty('model')) return false; // @Input('ngModel') model: any;
const change = changes['model'];
if (change.isFirstChange()) return true; // 判断是否首次改变
return !looseIdentical(viewModel, change.currentValue);
}
// JS has NaN !== NaN
export function looseIdentical(a: any, b: any): boolean {
return a === b || typeof a === 'number' && typeof b === 'number' && isNaN(a)
&& isNaN(b);
}
_updateValue()
// 更新控件的值
private _updateValue(value: any): void {
resolvedPromise.then(
() => { this.control.setValue(value, {emitViewToModelChange: false});
});
}
const resolvedPromise = Promise.resolve(null);
ngOnDestroy()
// 指令销毁时,从formDirective中移除该控件
ngOnDestroy(): void {
this.formDirective && this.formDirective.removeControl(this);
}
NgModel 方法
get control(): FormControl
// 获取控件
get control(): FormControl { return this._control; }
/** @internal */
_control = new FormControl();
get path(): string[]
// 获取控件的访问路径
get path(): string[] {
return this._parent ? controlPath(this.name, this._parent) : [this.name];
}
get validator(): ValidatorFn
// 获取同步验证器
get validator(): ValidatorFn {
return composeValidators(this._rawValidators);
}
export interface ValidatorFn { (c: AbstractControl): ValidationErrors|null; }
get asyncValidator(): AsyncValidatorFn
// 获取异步验证器
get asyncValidator(): AsyncValidatorFn {
return composeAsyncValidators(this._rawAsyncValidators);
}
export interface AsyncValidatorFn {
(c: AbstractControl): Promise|Observable;
}
viewToModelUpdate(newValue: any): void
// 触发ngModelChange事件
viewToModelUpdate(newValue: any): void {
this.viewModel = newValue;
// @Output('ngModelChange') update = new EventEmitter();
this.update.emit(newValue);
}
NgControl 抽象类
// angular2/packages/forms/src/directives/ng_control.ts
// 所有控件指令都需继承的基类,绑定FormControl对象至DOM元素
export abstract class NgControl extends AbstractControlDirective {
/** @internal */
_parent: ControlContainer = null;
name: string = null;
valueAccessor: ControlValueAccessor = null;
/** @internal */
_rawValidators: Array = [];
/** @internal */
_rawAsyncValidators: Array = [];
get validator(): ValidatorFn { return unimplemented(); }
get asyncValidator(): AsyncValidatorFn { return unimplemented(); }
abstract viewToModelUpdate(newValue: any): void;
}
AbstractControlDirective 抽象类
// angular2/packages/forms/src/directives/abstract_control_directive.ts
export abstract class AbstractControlDirective {
// 获取控件
get control(): AbstractControl { throw new Error('unimplemented'); }
// 获取控件的值
get value(): any { return this.control ? this.control.value : null; }
// 控件控件的验证状态 - valid、invalid、pending
get valid(): boolean { return this.control ? this.control.valid : null; }
get invalid(): boolean { return this.control ? this.control.invalid : null; }
get pending(): boolean { return this.control ? this.control.pending : null; }
get pristine(): boolean { return this.control ? this.control.pristine : null; }
get dirty(): boolean { return this.control ? this.control.dirty : null; }
get touched(): boolean { return this.control ? this.control.touched : null; }
get untouched(): boolean { return this.control ? this.control.untouched : null; }
get disabled(): boolean { return this.control ? this.control.disabled : null; }
get enabled(): boolean { return this.control ? this.control.enabled : null; }
// 获取控件验证异常对象
get errors(): ValidationErrors|null {
return this.control ? this.control.errors : null;
}
// 获取statusChanges对象
get statusChanges(): Observable {
return this.control ? this.control.statusChanges : null;
}
// 获取valueChanges对象
get valueChanges(): Observable {
return this.control ? this.control.valueChanges : null;
}
// 获取控件路径
get path(): string[] { return null; }
// 重设控件的值
reset(value: any = undefined): void {
if (this.control) this.control.reset(value);
}
// 判断是否path路径对应的控件,是否存在errorCode对应的错误
hasError(errorCode: string, path: string[] = null): boolean {
return this.control ? this.control.hasError(errorCode, path) : false;
}
// 获取path路径对应的控件,参数errorCode对应的错误
getError(errorCode: string, path: string[] = null): any {
return this.control ? this.control.getError(errorCode, path) : null;
}
}
input 指令
input 指令定义
@Directive({
selector:`
input:not([type=checkbox])[formControlName],textarea[formControlName],
input:not([type=checkbox])[formControl],textarea[formControl],
input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]
`,
host: {
'(input)': '_handleInput($event.target.value)',
'(blur)': 'onTouched()',
'(compositionstart)': '_compositionStart()',
'(compositionend)': '_compositionEnd($event.target.value)'
},
providers: [DEFAULT_VALUE_ACCESSOR]
})
相关说明
compositionstart - 事件触发于一段文字的输入之前 (类似于 keydown 事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)。
compositionend - 事件触发于完成文本段落输入或取消输入
compositionstart、compositionend 的实际应用,请参考 - 应对中文输入法的字符串截断方案
DEFAULT_VALUE_ACCESSOR
export const DEFAULT_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DefaultValueAccessor),
multi: true
};
DefaultValueAccessor
export class DefaultValueAccessor implements ControlValueAccessor {
onChange = (_: any) => {};
onTouched = () => {};
/** Whether the user is creating a composition string (IME events). */
private _composing = false;
constructor(
private _renderer: Renderer, // 注入Renderer对象
private _elementRef: ElementRef,
@Optional() @Inject(COMPOSITION_BUFFER_MODE)
private _compositionMode: boolean) {
if (this._compositionMode == null) {
this._compositionMode = !_isAndroid();
}
}
// 将模型中的新值写入视图或DOM元素属性中
writeValue(value: any): void {
const normalizedValue = value == null ? '' : value;
this._renderer.setElementProperty(this._elementRef.nativeElement,
'value', normalizedValue);
}
// 设置当控件接收到change事件后,调用的函数
registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
// 设置当控件接收到touched事件后,调用的函数
registerOnTouched(fn: () => void): void { this.onTouched = fn; }
// 设置控件的Disabled状态
setDisabledState(isDisabled: boolean): void {
this._renderer.setElementProperty(this._elementRef.nativeElement,
'disabled', isDisabled);
}
// 处理input事件
_handleInput(value: any): void {
if (!this._compositionMode || (this._compositionMode && !this._composing)) {
this.onChange(value);
}
}
// 处理compositionstart事件
_compositionStart(): void { this._composing = true; }
// 处理compositionend事件
_compositionEnd(value: any): void {
this._composing = false;
this._compositionMode && this.onChange(value);
}
}
export const COMPOSITION_BUFFER_MODE = new InjectionToken
('CompositionEventMode');
// 用于判断是否处于安卓平台,composition事件在iOS和Android存在兼容性
function _isAndroid(): boolean {
const userAgent = getDOM() ? getDOM().getUserAgent() : '';
return /android (\d+)/.test(userAgent.toLowerCase());
}
相关说明
为了能够支持跨平台,Angular 通过抽象层封装了不同平台的差异,统一了 API 接口。如定义了抽象类 Renderer 、抽象类 RootRenderer 等。此外还定义了以下引用类型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。
另外看完上面的代码,不知道读者有没有以下的疑问:
writeValue() 方法什么时候调用?
registerOnChange() 什么时候调用?
registerOnTouched() 什么时候调用?
为了解开这些疑惑我们就需要分析一下,一个很重要的方法 - setUpControl()。我们先来看一下 setUpControl() 的调用的时机点:
NgModel ngOnChanges 生命周期钩子
ngOnChanges(changes: SimpleChanges) {
...
if (!this._registered) this._setUpControl();
...
}
_setUpControl() 方法
private _setUpControl(): void {
this._isStandalone() ? this._setUpStandalone() :
// 在ControlContainer所属的form中注册该控件
this.formDirective.addControl(this);
this._registered = true; // 标识已注册
}
_setUpControl() 方法内部,先判断控件有设置 standalone 属性,如果有的话,则调用 _setUpStandalone() 方法:
// 若设置standalone属性,则初始化该控件,并更新控件的值和验证状态
private _setUpStandalone(): void {
setUpControl(this._control, this); // 调用时机点一
this._control.updateValueAndValidity({emitEvent: false});
}
如果没有设置 standalone 属性,则调用 this.formDirective.addControl(this),这个方法存在于我们的 form 指令中,我们直接看一下具体实现:
addControl(dir: NgModel): void {
resolvedPromise.then(() => {
const container = this._findContainer(dir.path);
dir._control = container.registerControl(dir.name, dir.control);
setUpControl(dir.control, dir); // 调用时机点二
dir.control.updateValueAndValidity({emitEvent: false});
});
}
搞清楚 setUpControl() 调用的时机点,是时候分析一下 setUpControl() 方法的具体实现了。
setUpControl()
// angular2/packages/forms/src/directives/shared.ts
export function setUpControl(control: FormControl, dir: NgControl): void {
if (!control) _throwError(dir, 'Cannot find control with');
/**
* NgModel构造函数
* @Optional() @Self() @Inject(NG_VALUE_ACCESSOR) valueAccessors: ControlValueAccessor[]
* this.valueAccessor = selectValueAccessor(this, valueAccessors);
*/
// 判断控件是否实现ControlValueAccessor接口
if (!dir.valueAccessor) _throwError(dir, 'No value accessor for form control with');
// 组合同步验证器
control.validator = Validators.compose([control.validator, dir.validator]);
// 组合异步验证器
control.asyncValidator = Validators.composeAsync([control.asyncValidator,
dir.asyncValidator]);
// 该方法用于将模型中的新值写入视图或 DOM 属性中
dir.valueAccessor.writeValue(control.value);
// view -> model
/**
* @Directive({
* selector: 'input:not([type=checkbox])[formControlName],...',
* host: {
* '(input)': '_handleInput($event.target.value)'
* },
* providers: [DEFAULT_VALUE_ACCESSOR]
* })
* export class DefaultValueAccessor implements ControlValueAccessor {
* // 下面就是调用该方法
* registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
*
* // input事件触发后,调用该方法
* _handleInput(value: any): void {
* if (!this._compositionMode || (this._compositionMode && !this._composing)) {
* this.onChange(value); //调用下面注册的onChange函数
* }
* }
* }
*
*/
dir.valueAccessor.registerOnChange((newValue: any) => {
/**
* ngModel指令 - viewToModelUpdate() 方法
*
* viewToModelUpdate(newValue: any): void {
* this.viewModel = newValue; // 更新viewModel
* // @Output('ngModelChange') update = new EventEmitter();
* this.update.emit(newValue); // 触发ngModelChange事件
* }
*/
dir.viewToModelUpdate(newValue);
control.markAsDirty();
/*
* setValue(value: any, {onlySelf, emitEvent, emitModelToViewChange,
* emitViewToModelChange}: {
* onlySelf?: boolean,
* emitEvent?: boolean,
* emitModelToViewChange?: boolean,
* emitViewToModelChange?: boolean
* } = {}): void {
* this._value = value;
* if (this._onChange.length && emitModelToViewChange !== false) {
* this._onChange.forEach((changeFn) => changeFn(this._value,
* emitViewToModelChange !== false));
* }
* this.updateValueAndValidity({onlySelf, emitEvent});
* }
*/
control.setValue(newValue, {emitModelToViewChange: false}); // 更新控件的值
});
// touched
dir.valueAccessor.registerOnTouched(() => control.markAsTouched());
/**
* control = new FormControl();
*
* control - _onChange 属性
* _onChange: Function[] = [];
*
* control - registerOnChange() 方法
* registerOnChange(fn: Function): void { this._onChange.push(fn); }
*/
control.registerOnChange((newValue: any, emitModelEvent: boolean) => {
// control -> view
/*
* writeValue(value: any): void {
* const normalizedValue = value == null ? '' : value;
* this._renderer.setElementProperty(this._elementRef.nativeElement, 'value',
* normalizedValue);
* }
*/
dir.valueAccessor.writeValue(newValue);
// control -> ngModel
/**
* ngModel指令 - viewToModelUpdate() 方法
*
* viewToModelUpdate(newValue: any): void {
* this.viewModel = newValue; // 更新viewModel
* // @Output('ngModelChange') update = new EventEmitter();
* this.update.emit(newValue); // 触发ngModelChange事件
* }
*/
if (emitModelEvent) dir.viewToModelUpdate(newValue);
});
// 当控件状态变成 DISABLED 或从 DISABLED 状态变化成 ENABLE 状态时,会调用该函数。该函数会根据参数
// 值,启用或禁用指定的 DOM 元素
if (dir.valueAccessor.setDisabledState) {
control.registerOnDisabledChange(
(isDisabled: boolean) => { dir.valueAccessor.setDisabledState(isDisabled); });
}
// re-run validation when validator binding changes, e.g. minlength=3 -> minlength=4
dir._rawValidators.forEach((validator: Validator | ValidatorFn) => {
if ((validator).registerOnValidatorChange)
(validator).registerOnValidatorChange(() =>
control.updateValueAndValidity());
});
dir._rawAsyncValidators.forEach((validator: AsyncValidator | AsyncValidatorFn) => {
if ((validator).registerOnValidatorChange)
(validator).registerOnValidatorChange(() =>
control.updateValueAndValidity());
});
}
最后我们再看一下 ControlValueAccessor 接口:
ControlValueAccessor
// angular2/packages/forms/src/directives/control_value_accessor.ts
export interface ControlValueAccessor {
writeValue(obj: any): void;
registerOnChange(fn: any): void;
registerOnTouched(fn: any): void;
setDisabledState?(isDisabled: boolean): void;
}
writeValue(obj: any):该方法用于将模型中的新值写入视图或 DOM 属性中
registerOnChange(fn: any):设置当控件接收到 change 事件后,调用的函数
registerOnTouched(fn: any):设置当控件接收到 touched 事件后,调用的函数
setDisabledState?(isDisabled: boolean):当控件状态变成 DISABLED 或从 DISABLED 状态变化成 ENABLE 状态时,会调用该函数。该函数会根据参数值,启用或禁用指定的 DOM 元素
了解 ControlValueAccessor 的详细信息,可以参考 - Understanding ControlValueAccessor
明天补充图示说明哈,能够理解的同学请直接略过。
参考资源
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- AngularJs依赖注入原理
什么是依赖注入?将一个或多个依赖(或服务)注入到一个独立的对象中。在angular中,provider、factory、service、value、constant可以用于注入,控制器和工厂方法(指令、服务、过滤器)可接受注入。…...
2024/4/30 12:27:16 - 配合angular的框架
如果你计划使用AngularJS创建你的Web应用,那现在就开始吧。你不需要有任何的恐惧和担心,因为现在有很多的框架都可以很好地支持AngularJS。这些框架都有事先安装的Web组件,使用它们可以帮助你快速进行项目开发。这里列举5个这样的框架&#x…...
2024/4/28 17:44:20 - Angular学习笔记之集成三方UI框架、控件
安装 Material UI 方法: Material 官网:https://material.angular.io step 1:npm install --save angular/material angular/cdkstep 2:npm install --save angular/animationsstep 3:angular.cli "../node_modules/angular/material/prebuilt-them…...
2024/4/21 4:02:18 - Vue、React、Angular最佳UI框架
摘要: 今天我们不聊技术,只"以貌取人"。 刚入门的小伙伴问我(上面是我的自拍照),现在前端Vue、React、Angular这三个框架似乎都很好,反而不知道选择什么了,我当时开玩笑的说你觉得哪个好看就选择…...
2024/4/29 1:29:53 - 排名前10的vue前端UI框架框架值得你掌握
最近在逛各大网站,论坛,SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,小编自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在做自己的公司项目…...
2024/4/21 4:02:17 - 排名前10的vue前端UI框架值得你掌握
最近在逛各大网站,论坛,SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,小编自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在做自己的公司项目…...
2024/4/21 4:02:15 - 14 款(移动端)UI 框架
因业务需求,特调研了当前比较火的移动端UI框架,在此做一个汇总。 star数据是截止发文时间(2018-08-18),仅供参考。 一、【H5通用UI】 WeUI Star:19743 WeUI 是一套同微信原生视觉体验一致的基础样式库,由…...
2024/4/29 8:46:52 - Angular CLI 的安装与使用
安装 $ npm install -g angular/cli (由于我最开始的NodeJS的版本为v8开头的版本,所以安装报错,查询的时候显示的是v8版本的还不能够支持angular,于是我就重新去官网下载了最新稳定的版本,安装angular成功。需要注意的…...
2024/4/20 19:56:11 - 使用AngularCLI快速开发一个Library
Angular8 Library库的使用一、创建并且运行angular项目二、创建angular library2.1 生成projects2.2 设置配置信息2.3 创建ng-package.prod.json文件三、开发 Lib库及打包 Lib库3.1 开发lib库3.2 打包lib库四、测试并使用 Lib库五、参考学习地址关键字说明:Lib库: 我们要开发的…...
2024/4/20 19:56:10 - 安装Angular CLI开发工具
目前,无论你使用什么前端框架,都必然要用到NodeJS工具,Angular也不例外,与其他框架不同的是,Angular一开始就使用“全家桶”式的设计思路,因此angular/cli这款工具里面集成了日常开发需要使用的所有Node模板…...
2024/4/20 19:56:09 - Angular CLI 创建你的第一个 Angular 示例程序
第一步:安装 Angular CLI 你要使用 Angular CLI 来创建项目、创建应用和库代码,并执行多种开发任务,比如测试、打包和发布。 全局安装 Angular CLI。 要想使用 npm 来安装 CLI,请打开终端/控制台窗口,并输入下列命令…...
2024/5/7 17:44:44 - 为何用Angular CLI 以及安装和使用
Angular CLI 安装和使用 Keriy 关注 2017.06.22 20:54* 字数 1513 阅读 6029评论 4喜欢 6大家好,我是IT修真院成都分院第5期的学员,一枚正直纯洁善良的web程序员 今天给大家分享一下下一代前端开发环境Angular开发工具Angular CLI的安装和使用。 一、 背…...
2024/5/7 19:32:45 - angular 项目打包发布指令
node --max-old-space-size8192 node_modules\\angular\\cli\\bin\\ng build --prod...
2024/4/21 4:02:13 - angular-cli 安装遇到的问题
新入手angular安装以及环境配置跟初始化项目的时候碰到了各种问题,能蒙圈好长时间。 首先就是安装Node跟NPM,node直接在官网(https://nodejs.org)下载就行,我选择了最新版本 最新的node安装完成后,包含了np…...
2024/4/21 4:02:12 - angular项目打包_Angular版基础前端框架
前端框架介绍1. 体系结构本系统建立在ng-alain的基础上。ng-alain 脚手架是基于 Angular 和 ng-zorro-antd(Ant Design 的 Angular 版本) 基础组件库的中后台前端解决方案。脚手架包含着一套通用的功能和业务组件库,它们可以极大的减少一些基础建设开发工作。2. 整体…...
2024/4/21 4:02:11 - 使用Angular CLI快速搭建Angular2工程(一)
本文适合angular初学者阅读。 1.前言 随着web前端的火热,各种新框架层出不穷,当下比较流行的诸如 vue angular react 等,vue以其上手快的特点,在国内是异常火热。angular2在国外非常受欢迎(毕竟是google大佬开发的嘛…...
2024/4/21 4:02:09 - 前端入门,使用Angular CLI完成增删改查页面
目录 一:环境准备 1.1下载nodejs 1.2修改模块路径和缓存路径配置 1.3环境变量配置 二:Angular安装和项目创建 2.1安装typeScript 2.2angular cli安装 2.3使用webstorm创建AngularCLI项目 三.AngularCLI增删改查页面代码 3.1angular文件目录分析…...
2024/4/21 4:02:08 - 解决:Angular-cli:执行ng-build --prod后,dist文件里无js文件、文件未压缩等问题
解决:Angular-cli:执行ng-build --prod后,dist文件里无js文件、文件未压缩等问题参考文章: (1)解决:Angular-cli:执行ng-build --prod后,dist文件里无js文件、文件未压缩等问题 (2…...
2024/4/24 23:10:32 - angular cli开发angular环境搭建
NodeJs环境安装与配置 下载地址 1. 官网地址:https://nodejs.org/en/ 2. 中文地址:http://nodejs.cn/download/ 下载完成后,一直下一步安装就行,期间最好指定安装目录,我的安装目录为: D:\install\nodejs…...
2024/4/21 4:02:06 - Angular CLI终极教程指南
Angular是什么? Angular CLI 是一个命令行接口(Command Line Interface),用于实现自动化开发工作流程。它允许你做以下这些事情: 创建一个新的 Angular 应用程序 运行带有 LiveReload 支持的开发服务器,以便在开发过程中预览应用…...
2024/4/21 4:02:06
最新文章
- C# Winform代码
功能1: TextBox控件,只允许输入正负数字和小数,且小数点只能后两位 功能2: winform控件启动线程,执行任务 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u…...
2024/5/8 3:43:58 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - 探索进程控制第一弹(进程终止、进程等待)
文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么?进程终止的情况代码跑完,结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…...
2024/5/5 1:11:34 - 蓝桥杯第十五届抱佛脚(十)贪心算法
蓝桥杯第十五届抱佛脚(十)贪心算法 贪心算法基本概念 贪心算法是一种在算法设计中常用的方法,它在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。 贪…...
2024/5/5 8:38:28 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/7 5:50:09 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/7 14:25:14 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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