angular学习之路18-ngmodule
1,NgModule简介
NgModules 用于配置注入器和编译器,并帮你把那些相关的东西组织在一起。
NgModule 是一个带有 @NgModule
装饰器的类。 @NgModule
的参数是一个元数据对象,用于描述如何编译组件的模板,以及如何在运行时创建注入器。 它会标出该模块自己的组件、指令和管道,通过 exports
属性公开其中的一部分,以便外部组件使用它们。 NgModule
还能把一些服务提供商添加到应用的依赖注入器中。
Angular 模块化
模块是组织应用和使用外部库扩展应用的最佳途径。
Angular 自己的库都是 NgModule,比如 FormsModule
、HttpClientModule
和 RouterModule
。 很多第三方库也是 NgModule,比如 Material Design、 Ionic 和 AngularFire2。
NgModule 把组件、指令和管道打包成内聚的功能块,每个模块聚焦于一个特性区域、业务领域、工作流或通用工具。
模块还可以把服务加到应用中。 这些服务可能是内部开发的(比如你自己写的),或者来自外部的(比如 Angular 的路由和 HTTP 客户端)。
模块可以在应用启动时急性加载,也可以由路由器进行异步的惰性加载。
NgModule 的元数据会做这些:
-
声明某些组件、指令和管道属于这个模块。
-
公开其中的部分组件、指令和管道,以便其它模块中的组件模板中可以使用它们。
-
导入其它带有组件、指令和管道的模块,这些模块中的元件都是本模块所需的。
-
提供一些供应用中的其它组件使用的服务。
每个 Angular 应用都至少有一个模块,也就是根模块。 你可以引导那个模块,以启动该应用。
对于那些只有少量组件的简单应用,根模块就是你所需的一切。 随着应用的成长,你要把这个根模块重构成一些特性模块,它们代表一组密切相关的功能集。 然后你再把这些模块导入到根模块中。
2,JavaScript 模块 vs. NgModule
JavaScript 模块
在 JavaScript 中,模块是内含 JavaScript 代码的独立文件。要让其中的东西可用,你要写一个导出语句,通常会放在相应的代码之后,类似这样:
export class AppComponent { ... }
然后,当你在其它文件中需要这个文件的代码时,要像这样导入它:
import { AppComponent } from './app.component';
JavaScript 模块让你能为代码加上命名空间,防止因为全局变量而引起意外
NgModules
NgModule 是一些带有 @NgModule
装饰器的类。@NgModule
装饰器的 imports
数组会告诉 Angular 哪些其它的 NgModule 是当前模块所需的。 imports
数组中的这些模块与 JavaScript 模块不同,它们都是 NgModule 而不是常规的 JavaScript 模块。 带有 @NgModule
装饰器的类通常会习惯性地放在单独的文件中,但单独的文件并不像 JavaScript 模块那样作为必要条件,而是因为它带有 @NgModule
装饰器及其元数据。
NgModule 类与 JavaScript 模块有下列关键性的不同:
-
NgModule 只绑定了可声明的类,这些可声明的类只是供 Angular 编译器用的。
-
与 JavaScript 类把它所有的成员类都放在一个巨型文件中不同,你要把该模块的类列在它的
@NgModule.declarations
列表中。 -
NgModule 只能导出可声明的类。这可能是它自己拥有的也可能是从其它模块中导入的。它不会声明或导出任何其它类型的类。
-
与 JavaScript 模块不同,NgModule 可以通过把服务提供商加到
@NgModule.providers
列表中,来用服务扩展整个应用。
3,常用模块
Angular 应用需要不止一个模块,它们都为根模块服务。 如果你要把某些特性添加到应用中,可以通过添加模块来实现。 下列是一些常用的 Angular 模块,其中带有一些其内容物的例子:
NgModule | 导入自 | 为何使用 |
---|---|---|
|
| 当你想要在浏览器中运行应用时 |
|
| 当你想要使用 |
|
| 当要构建模板驱动表单时(它包含 |
|
| 当要构建响应式表单时 |
RouterModule | @angular/router | 要使用路由功能,并且你要用到 |
|
| 当你要和服务器对话时 |
导入模块
当你使用这些 Angular 模块时,在 AppModule
(或适当的特性模块)中导入它们,并把它们列在当前 @NgModule
的 imports
数组中。比如,在 Angular CLI 生成的基本应用中,BrowserModule
会在 app.module.ts
中 AppModule
的顶部最先导入。
/* import modules so that AppModule can access them */
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [ /* add modules here so Angular knows to use them */
BrowserModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
文件顶部的这些导入是 JavaScript 的导入语句,而 @NgModule
中的 imports
数组则是 Angular 特有的。 要了解更多的不同点,参见 JavaScript 模块 vs. NgModule。
BrowserModule
和 CommonModule
BrowserModule
导入了 CommonModule
,它贡献了很多通用的指令,比如 ngIf
和 ngFor
。 另外,BrowserModule
重新导出了 CommonModule
,以便它所有的指令在任何导入了 BrowserModule
的模块中都可以使用。
对于运行在浏览器中的应用来说,都必须在根模块中 AppModule
导入 BrowserModule
,因为它提供了启动和运行浏览器应用时某些必须的服务。BrowserModule
的提供商是面向整个应用的,所以它只能在根模块中使用,而不是特性模块。 特性模块只需要 CommonModule
中的常用指令,它们不需要重新安装所有全应用级的服务。
如果你把 BrowserModule
导入了惰性加载的特性模块中,Angular 就会返回一个错误,并告诉你要改用 CommonModule
。
//意思是browsemodile是保证应用在浏览器运行所必须的,而commonmodule其实是包含在browsemodule中的,只是也可以值导入commonmodule,它从browsemodule中导出为特定功能的module
4,特性模块的分类
下面是特性模块的五个常用分类,包括五组:
-
领域特性模块。
-
带路由的特性模块。
-
路由模块。
-
服务特性模块
-
可视部件特性模块。
虽然下面的指南中描述了每种类型的使用及其典型特征,但在实际的应用中,你还可能看到它们的混合体。
特性模块 | 指导原则 |
---|---|
领域 | 领域特性模块用来给用户提供应用程序领域中特有的用户体验,比如编辑客户信息或下订单等。 它们通常会有一个顶级组件来充当该特性的根组件,并且通常是私有的。用来支持它的各级子组件。 领域特性模块大部分由 领域特性模块很少会有服务提供商。如果有,那么这些服务的生命周期必须和该模块的生命周期完全相同。 领域特性模块通常会由更高一级的特性模块导入且只导入一次。 对于缺少路由的小型应用,它们可能只会被根模块 |
路由 | 带路由的特性模块是一种特殊的领域特性模块,但它的顶层组件会作为路由导航时的目标组件。 根据这个定义,所有惰性加载的模块都是路由特性模块。 带路由的特性模块不会导出任何东西,因为它们的组件永远不会出现在外部组件的模板中。 惰性加载的路由特性模块不应该被任何模块导入。如果那样做就会导致它被急性加载,破坏了惰性加载的设计用途。 也就是说你应该永远不会看到它们在 路由特性模块很少会有服务提供商,原因参见惰性加载的特性模块中的解释。如果那样做,那么它所提供的服务的生命周期必须与该模块的生命周期完全相同。不要在路由特性模块或被路由特性模块所导入的模块中提供全应用级的单例服务。 |
路由 | 路由模块为其它模块提供路由配置,并且把路由这个关注点从它的配套模块中分离出来。 路由模块通常会做这些:
路由模块只应该被它的配套模块导入。 |
服务 | 服务模块提供了一些工具服务,比如数据访问和消息。理论上,它们应该是完全由服务提供商组成的,不应该有可声明对象。Angular 的 根模块 |
窗口部件 | 窗口部件模块为外部模块提供组件、指令和管道。很多第三方 UI 组件库都是窗口部件模块。 窗口部件模块应该完全由可声明对象组成,它们中的大部分都应该被导出。 窗口部件模块很少会有服务提供商。 如果任何模块的组件模板中需要用到这些窗口部件,就请导入相应的窗口部件模块。 |
下表中汇总了各种特性模块类型的关键特征。
特性模块 | 声明 | 提供商 | 导出什么 | 被谁导入 |
---|---|---|---|---|
领域 | 有 | 罕见 | 顶级组件 | 特性模块,AppModule |
路由 | 有 | 罕见 | 无 | 无 |
路由 | 无 | 是(守卫) | RouterModule | 特性(供路由使用) |
服务 | 无 | 有 | 无 | AppModule |
窗口部件 | 有 | 罕见 | 有 | 特性 |
5,入口组件
入口组件有两种主要的类型:
-
引导用的根组件。
-
在路由定义中指定的组件。
引导用的入口组件
下面这个例子中指定了一个引导用组件 AppComponent
,位于基本的 app.module.ts
中:、
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpClientModule,
AppRoutingModule
],
providers: [],
bootstrap: [AppComponent] // bootstrapped entry component
})
可引导组件是一个入口组件,Angular 会在引导过程中把它加载到 DOM 中。 其它入口组件是在其它时机动态加载的,比如用路由器。
Angular 会动态加载根组件 AppComponent
,是因为它的类型作为参数传给了 @NgModule.bootstrap
函数。
引导用的组件必须是入口组件,因为引导过程是命令式的,所以它需要一个入口组件。
路由到的入口组件
入口组件的第二种类型出现在路由定义中,就像这样:
content_copyconst routes: Routes = [{path: '',component: CustomerListComponent}
];
路由定义使用组件类型引用了一个组件:component: CustomerListComponent
。
所有路由组件都必须是入口组件。这需要你把同一个组件添加到两个地方(路由中和 entryComponents
中),但编译器足够聪明,可以识别出这里是一个路由定义,因此它会自动把这些路由组件添加到 entryComponents
中。
entryComponents
数组
虽然 @NgModule
装饰器具有一个 entryComponents
数组,但大多数情况下你不用显式设置入口组件,因为 Angular 会自动把 @NgModule.bootstrap
中的组件以及路由定义中的组件添加到入口组件中。 虽然这两种机制足够自动添加大多数入口组件,但如果你要用其它方式根据类型来命令式的引导或动态加载某个组件,你就必须把它们显式添加到 entryComponents
中了。
entryComponents
和编译器
对于生产环境的应用,你总是希望加载尽可能小的代码。 这些代码应该只包含你实际使用到的类,并且排除那些从未用到的组件。因此,Angular 编译器只会为那些可以从 entryComponents
中直接或间接访问到的组件生成代码。 这意味着,仅仅往 @NgModule.declarations
中添加更多引用,并不能表达出它们在最终的代码包中是必要的。
实际上,很多库声明和导出的组件都是你从未用过的。 比如,Material Design 库会导出其中的所有组件,因为它不知道你会用哪一个。然而,显然你也不打算全都用上。 对于那些你没有引用过的,摇树优化工具就会把这些组件从最终的代码包中摘出去。
如果一个组件既不是入口组件也不没有在模板中使用过,摇树优化工具就会把它扔出去。 所以,最好只添加那些真正的入口组件,以便让应用尽可能保持精简。
6,特性模块
随着应用的增长,你可能需要组织与特定应用有关的代码。 这将帮你把特性划出清晰的边界。使用特性模块,你可以把与特定的功能或特性有关的代码从其它代码中分离出来。 为应用勾勒出清晰的边界,有助于开发人员之间、小组之间的协作,有助于分离各个指令,并帮助管理根模块的大小。
特性模块 vs. 根模块
与核心的 Angular API 的概念相反,特性模块是最佳的组织方式。特性模块提供了聚焦于特定应用需求的一组功能,比如用户工作流、路由或表单。 虽然你也可以用根模块做完所有事情,不过特性模块可以帮助你把应用划分成一些聚焦的功能区。特性模块通过它提供的服务以及共享出的组件、指令和管道来与根模块和其它模块合作。
如何制作特性模块
如果你已经有了 Angular CLI 生成的应用,可以在项目的根目录下输入下面的命令来创建特性模块。把这里的 CustomerDashboard
替换成你的模块名。你可以从名字中省略掉“Module”后缀,因为 CLI 会自动追加上它:
ng generate module CustomerDashboard
这会让 CLI 创建一个名叫 customer-dashboard
的文件夹,其中有一个名叫 customer-dashboard.module.ts
,内容如下
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@NgModule({
imports: [
CommonModule
],
declarations: []
})
export class CustomerDashboardModule { }
//此处是特性模块生成的ts文件,其内容和app.module是一样的
无论根模块还是特性模块,其 NgModule 结构都是一样的。在 CLI 生成的特性模块中,在文件顶部有两个 JavaScript 的导入语句:第一个导入了 NgModule
,它像根模块中一样让你能使用 @NgModule
装饰器;第二个导入了 CommonModule
,它提供了很多像 ngIf
和 ngFor
这样的常用指令。 特性模块导入 CommonModule
,而不是 BrowserModule
,后者只应该在根模块中导入一次。 CommonModule
只包含常用指令的信息,比如 ngIf
和 ngFor
,它们在大多数模板中都要用到,而 BrowserModule
为浏览器所做的应用配置只会使用一次。
declarations
数组让你能添加专属于这个模块的可声明对象(组件、指令和管道)。 要添加组件,就在命令行中输入如下命令,这里的 customer-dashboard
是一个目录,CLI 会把特性模块生成在这里,而 CustomerDashboard
就是该组件的名字:
ng generate component customer-dashboard/CustomerDashboard
这会在 customer-dashboard
中为新组件生成一个目录,并使用 CustomerDashboardComponent
的信息修改这个特性模块:
// import the new component
import { CustomerDashboardComponent } from './customer-dashboard/customer-dashboard.component';
@NgModule({
imports: [
CommonModule
],
declarations: [
CustomerDashboardComponent //此处把本特性模块的 组件声明到module中
],
})
导入特性模块
要想把这个特性模块包含进应用中,你还得让根模块 app.module.ts
知道它。注意,在 customer-dashboard.module.ts
文件底部 CustomerDashboardModule
的导出部分。这样就把它暴露出来,以便其它模块可以拿到它。要想把它导入到 AppModule
中,就把它加入 app.module.ts
的导入表中,并将其加入 imports
数组:
import { HttpClientModule } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
// import the feature module here so you can add it to the imports array below
import { CustomerDashboardModule } from './customer-dashboard/customer-dashboard.module';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpClientModule,
CustomerDashboardModule // add the feature module here //此处就i是特性模块里面自定义的组件,而在本应用模块中的自定义组件是声明到decalars中的
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
现在 AppModule
知道这个特性模块了。如果你往该特性模块中加入过任何服务提供商,AppModule
也同样会知道它,其它模块中也一样。不过,NgModule 并不会暴露出它们的组件。
渲染特性模块的组件模板
当 CLI 为这个特性模块生成 CustomerDashboardComponent
时,还包含一个模板 customer-dashboard.component.html
,它带有如下页面脚本:
<p>
customer-dashboard works!
</p>
要想在 AppComponent
中查看这些 HTML,你首先要在 CustomerDashboardModule
中导出 CustomerDashboardComponent
。 在 customer-dashboard.module.ts
中,declarations
数组的紧下方,加入一个包含 CustomerDashboardModule
的 exports
数组:
exports: [
CustomerDashboardComponent //此块代码是在生成的特性模板中的类似appmodule.ts中的exports数组里面
]
然后,在 AppComponent
的 app.component.html
中,加入标签 <app-customer-dashboard>
:
<h1>
{{title}}
</h1>
<!-- add the selector from the CustomerDashboardComponent -->
<app-customer-dashboard></app-customer-dashboard>
7,服务提供商
提供服务
如果你是用 Angular CLI 创建的应用,那么可以使用下列 CLI 的 ng generate
命令在项目根目录下创建一个服务。把其中的 User
替换成你的服务名。
ng generate service User
该命令会创建下列 UserService
骨架:
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root', //providedIn: 'root'
指定 Angular 应该在根注入器中提供该服务。
})
export class UserService {
}
现在,你就可以在应用中到处注入 UserService
了。
该服务本身是 CLI 创建的一个类,并且加上了 @Injectable()
装饰器。默认情况下,该装饰器是用 providedIn
属性进行配置的,它会为该服务创建一个提供商。在这个例子中,providedIn: 'root'
指定 Angular 应该在根注入器中提供该服务。
提供商的作用域
当你把服务提供商添加到应用的根注入器中时,它就在整个应用程序中可用了。 另外,这些服务提供商也同样对整个应用中的类是可用的 —— 只要它们有供查找用的服务令牌。
你应该始终在根注入器中providedIn
与 NgModule提供这些服务 —— 除非你希望该服务只有在消费方要导入特定的 @NgModule
时才生效。
providedIn
与 NgModule
也可以规定某个服务只有在特定的 @NgModule
中提供。比如,如果你你希望只有当消费方导入了你创建的 UserModule
时才让 UserService
在应用中生效,那就可以指定该服务要在该模块中提供:
import { Injectable } from '@angular/core';
import { UserModule } from './user.module';
@Injectable({
providedIn: UserModule, //指定只在本UserModule里面提供服务
})
export class UserService {
}
上面的例子展示的就是在模块中提供服务的首选方式。之所以推荐该方式,是因为当没有人注入它时,该服务就可以被摇树优化掉。如果没办法指定哪个模块该提供这个服务,你也可以在那个模块中为该服务声明一个提供商:
import { NgModule } from '@angular/core';
import { UserService } from './user.service';
@NgModule({
providers: [UserService],
})
export class UserModule {
}
使用惰性加载模块限制提供商的作用域
在 CLI 生成的基本应用中,模块是急性加载的,这意味着它们都是由本应用启动的,Angular 会使用一个依赖注入体系来让一切服务都在模块间有效。对于急性加载式应用,应用中的根注入器会让所有服务提供商都对整个应用有效。
当使用惰性加载时,这种行为需要进行改变。惰性加载就是只有当需要时才加载模块,比如路由中。它们没办法像急性加载模块那样进行加载。这意味着,在它们的 providers
数组中列出的服务都是不可用的,因为根注入器并不知道这些模块。
当 Angular 的路由器惰性加载一个模块时,它会创建一个新的注入器。这个注入器是应用的根注入器的一个子注入器。想象一棵注入器树,它有唯一的根注入器,而每一个惰性加载模块都有一个自己的子注入器。路由器会把根注入器中的所有提供商添加到子注入器中。如果路由器在惰性加载时创建组件, Angular 会更倾向于使用从这些提供商中创建的服务实例,而不是来自应用的根注入器的服务实例。
任何在惰性加载模块的上下文中创建的组件(比如路由导航),都会获取该服务的局部实例,而不是应用的根注入器中的实例。而外部模块中的组件,仍然会收到来自于应用的根注入器创建的实例。
虽然你可以使用惰性加载模块来提供实例,但不是所有的服务都能惰性加载。比如,像路由之类的模块只能在根模块中使用。路由器需要使用浏览器中的全局对象 location
进行工作。
使用组件限定服务提供商的作用域
另一种限定提供商作用域的方式是把要限定的服务添加到组件的 providers
数组中。组件中的提供商和 NgModule 中的提供商是彼此独立的。 当你要急性加载一个自带了全部所需服务的模块时,这种方式是有帮助的。 在组件中提供服务,会限定该服务只能在该组件中有效(同一模块中的其它组件不能访问它)。
src/app/app.component.ts
content_copy@Component({
/* . . . */providers: [UserService]
})
在模块中提供服务还是在组件中?
通常,要在根模块中提供整个应用都需要的服务,在惰性加载模块中提供限定范围的服务。
路由器工作在根级,所以如果你把服务提供商放进组件(即使是 AppComponent
)中,那些依赖于路由器的惰性加载模块,将无法看到它们。
当你必须把一个服务实例的作用域限定到组件及其组件树中时,可以使用组件注册一个服务提供商。 比如,用户编辑组件 UserEditorComponent
,它需要一个缓存 UserService
实例,那就应该把 UserService
注册进 UserEditorComponent
中。 然后,每个 UserEditorComponent
的实例都会获取它自己的缓存服务实例。
8,单例服务
提供单例服务
在 Angular 中有两种方式来生成单例服务:
-
把
@Injectable()
的providedIn
属性声明为root
。 -
把该服务包含在
AppModule
或某个只会被AppModule
导入的模块中。
使用 providedIn
从 Angular 6.0 开始,创建单例服务的首选方式就是在那个服务类的 @Injectable
装饰器上把 providedIn
设置为 root
。这会告诉 Angular 在应用的根上提供此服务。
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class UserService {
}
NgModule 的 providers
数组
在基于 Angular 6.0 以前的版本构建的应用中,服务是注册在 NgModule 的 providers
数组中的,就像这样:
content_copy@NgModule({...providers: [UserService],...
})
如果这个 NgModule 是根模块 AppModule
,此 UserService
就会是单例的,并且在整个应用中都可用。虽然你可能会看到这种形式的代码,但是最好使用在服务自身的 @Injectable()
装饰器上设置 providedIn
属性的形式,因为 Angular 6.0 可以对这些服务进行摇树优化。
forRoot()
模式
通常,你只需要用 providedIn
提供服务,用 forRoot()
/forChild()
提供路由即可。 不过,理解 forRoot()
为何能够确保服务只有单个实例,可以让你学会更深层次的开发知识。
如果模块同时定义了 providers(服务)和 declarations(组件、指令、管道),那么,当你同时在多个特性模块中加载此模块时,这些服务就会被注册在多个地方。这会导致出现多个服务实例,并且该服务的行为不再像单例一样。
有多种方式来防止这种现象:
-
用
providedIn
语法代替在模块中注册服务的方式。 -
把你的服务分离到它们自己的模块中。
-
在模块中分别定义
forRoot()
和forChild()
方法。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 后台管理UI的选择
最近要做一个企业的OA系统,以前一直使用EasyUI,一切都好,但感觉有点土了,想换成现在流行的Bootstrap为基础的后台UI风格,想满足的条件应该达到如下几个:1、美观、大方、简洁 2、兼容IE8、不考虑兼容IE6/IE7…...
2024/4/24 0:21:10 - Angular 7 和 .Net Core 2.2——全球天气(第1部分)
目录 介绍 设置Angular CLI环境 先决条件 npm包管理器 从Visual Studio 2017创建Asp.Net核心Web项目 使用Angular CLI创建天气客户端 天气信息REST API 天气组件 Angular 路由 反应表单(Reactive Form) 在Angular App中使用Bootstrap 4样式 Angular 服务 Angular …...
2024/4/30 18:06:41 - InputStreamWrite:字符流
两种读取方法如下所示:package cn.zll.demo;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader;public class WriteDemo {public static void main(String[] args) throws IOException {…...
2024/4/26 21:23:55 - angular学习之路3-架构
1, 架构概览 Angular 的基本构造块是 NgModule,它为组件提供了编译的上下文环境。 NgModule 会把相关的代码收集到一些功能集中。Angular 应用就是由一组 NgModule 定义出的。 应用至少会有一个用于引导应用的根模块,通常还会有很多特性模块…...
2024/5/7 7:55:53 - angular学习记录
1 angular项目文件解析 创建一个angular项目ng new demo,会比较慢,等等 组件可以理解为一段带有业务逻辑和数据的html 2 组件文件的解析 组件控制屏幕上被称为视图的一小片区域。组件通过一些由属性和方法组成 //从angular核心库导入Component装饰…...
2024/4/23 6:14:35 - Angular学习笔记(第四天)
一、Ionic的使用 1.概述: Ionic是基于angular的移动端的ui组件库: (在后续的升级版本中,也在支持以cdn的方式,支持vue、react、js,但是这个新版本手册不够友好,还有些问题) ionic…...
2024/4/26 10:54:49 - angular2--下拉更新和上拉加载更多
效果如下: (1)页面往下拉做刷新页面操作 (2)页面往上滑到底部时,加载更多数据## 标题 html <ons-page><ons-toolbar><div class"left"></div><div class"cen…...
2024/4/26 10:50:52 - 【Angular 6】滚动列表组件的封装
前言 学习应为input和output相结合之过程,这就是写这篇文章的原因。在大屏幕展示web APP中,经常会用到滚动列表。经过几次尝试,确定了一个还不错的思路。 需求 列表表头thead部分静止,而tbody部分向上滚动。tbody部分滚动结束之后…...
2024/5/7 3:23:51 - 微服务的脚手架Jhipster集成angular和vue的使用
JHipster简介 JHipster或者称Java Hipster,是一个应用代码产生器,能够创建Spring Boot AngularJS的应用。开源项目地址:JHipster/Github。 JHipster使用Node.js和Yeoman产生Java应用代码,使用Maven(Gradle)运行产生的代码&…...
2024/4/21 3:13:21 - Angular-3种创建动态内容的方式
写在最前,本文提到的“模板”都是ng-template;假设的模态组件也只是实现模态内容;为了缩减文章的篇幅,只保留了重要的部分。完整的例子在线上。在开发过程中,难免会遇到公共组件需要Input模板或input组件的时候&#x…...
2024/4/21 3:13:21 - Angular:nz-table中显示横向滚动条
首先,可以参考一下ant-design官方文档中对于横向滚动条的用法(这里参考1.8.1版本的固定列方法): import { Component } from angular/core;Component({selector: nz-demo-table-fixed-columns,template: <nz-table #nzTable […...
2024/5/6 19:36:36 - 原生、混合、react-native应用对比分析
原生开发、纯网页开发(H5开发)/混合开发(H5原生)、React-Native开发 原生开发是系统自带的app开发方式,也是大部分人最熟悉app开发的技术,如android、ios、wp。H5开发是Html5开发的app,本质上运…...
2024/5/3 8:21:18 - Angular2中echarts的使用(饼图)
ECharts (以饼图为例) ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览(IE8/9/10/11,Chrome,Firefox,Safari等)ÿ…...
2024/5/9 0:08:07 - Angular 8 从基础到项目实战 完整的Angular学习路径
安装npm依赖包 推荐使用http npm i --registryhttp://registry.npmjs.org/ 关于跨域可以使用nginx代理,关于package.json可以执行npm start,npm build… "scripts": {"ng": "ng","start": "ng serve","start.prod&q…...
2024/4/21 3:13:16 - angular锚点和返回顶部功能设计。
angular锚点和返回顶部功能设计。 返回顶部代码 typescrtipt代码 // 返回到顶部按钮HostListener(window:scroll)checkScroll(): void{const scrollPosition window.pageYOffset ||document.documentElement.scrollTop || document.body.scrollTop || 0if (scrollPosition &…...
2024/4/20 20:10:48 - Angular 实现Bootstrap ScrollSpy控件
Bootstap是基于JQuery开发,Angular中不支持Bootstrap相关事件逻辑。本文基于Typecript开发了一个Angular可用的ScrollSpy控件。Scrollspy控件主要实现了左侧导航以及右侧正文之间的联动和切换。所以, 此组件主要解决两个问题: (1&…...
2024/5/9 18:17:33 - angular技巧_提升Angular技能的5个技巧
angular技巧This summer me and Roman started a series of tweets with helpful tips and tricks about Angular. It was met well by the community so I decided to write an article follow-up. Here are 5 generalized advises I want to give to Angular developers acro…...
2024/4/20 20:10:46 - 解析Angular 7的十大特性
Angular是最流行的Web应用程序开发框架之一。随着Angular 7的发布,它为Web开发人员带来了更多功能,包括核心框架、Angular Material、与主要版本保持同步的CLI和工具链,并且还有了几个主要合作伙伴。 我们将在本文中介绍Angular团队发布的一些…...
2024/5/4 6:18:33 - angular2--实现类似大众点评的左右分类栏目效果
一、主要实现效果如下显示 1、左边为侧栏导航,右边为对应左边分类的子菜单列表。 2、左边菜单点击时,右边的对应的子菜单就会滚到页面的顶部;同理,右边的子菜单滚动时,左边的侧栏导航也会去到对应的分类处。 二、页…...
2024/4/21 3:13:15 - Angular2.0的项目架构
Angular2.0的项目架构 一、项目服务端app a) Controller控制器 b) Router路由 c) Service服务 d) Public公共样式及脚本和图片等静态资源 e) View静态页面 f) Engine公共的配置文件及方法 g) Extend框架扩展 h) Middleware编写中间件 二、项目客户端src a) App i. App.componen…...
2024/4/21 3:13:14
最新文章
- 如何使用Python为Excel文件添加预设文档属性和自定义文档属性
向Excel文件添加文档属性是专业地组织和管理电子表格数据的关键步骤。这些属性,如标题、作者、主题和关键词,增强了文件的元数据,使得在大型数据库或文件系统中跟踪、排序和搜索文档变得更加容易。通过包含这些信息,您不仅提高了文…...
2024/5/10 19:14:02 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/9 21:23:04 - 如何在极狐GitLab 使用Docker 仓库功能
本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何在[极狐GitLab…...
2024/5/9 14:06:25 - ROS2高效学习第十章 -- ros2 高级组件之大型项目中的 launch 其二
ros2 高级组件之大型项目中的 launch 1 前言和资料2 正文2.1 启动 turtlesim,生成一个 turtle ,设置背景色2.2 使用 event handler 重写上节的样例2.3 turtle_tf_mimic_rviz_launch 样例 3 总结 1 前言和资料 早在ROS2高效学习第四章 – ros2 topic 编程…...
2024/5/10 17:35:38 - Linux mount用法
在Linux系统中,系统自动挂载了以下挂载点: /: xfs文件系统,根文件系统, 所有其他文件系统的挂载点。 /sys: sysfs文件系统,提供内核对象的信息和接口。 /proc: proc文件系统,提供进程和系统信息。 /dev: devtmpfs文件系…...
2024/5/10 13:43:58 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/10 12:36:12 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/9 15:10:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到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/9 4:20:59 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
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/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/10 10:22:18 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/9 17:11:10 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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