【Angular本身对于状态的管理也是相当到位的,即使不使用redux,也可以做到跨组件共享数据,而且实现起来是非常容易的。】【在Angular框架中,它还深度继承了Rxjs,使得它处理异步编程的能力变得非常强大】
2、创建项目
import{Component}from"@angular/core"@Component({selector:"app-root",templateUrl:"./app.component.html",styleUrls:["./app.component.css"]})exportclassAppComponent{title="angular-test"}NgModule为组件提供了编译的上下文环境。
import{NgModule}from'@angular/core';import{AppComponent}from'./app.component';@NgModule({declarations:[AppComponent],bootstrap:[AppComponent]})exportclassAppModule{}关于Component有一个重要的点需要说明:组件必须是要属于一个NgModule的,也即是说NgModule为组件提供了编译的上下文环境,这也是Angular强制规定的,是Angular应用组织文件的一种方式。
服务用于放置和特定组件无关并希望跨组件共享的数据或逻辑。服务出现的目的在于解耦组件类中的代码,使组件类中的代码干净整洁。服务是由Injectable装饰器装饰的类。
import{Injectable}from'@angular/core';@Injectable({})exportclassAppService{}在使用服务时不需要在组件类中通过new的方式创建服务实例对象获取服务中提供的方法,以下写法错误,切记切记!!!
import{AppService}from"./AppService"exportclassAppComponent{letappService=newAppService()}可以想到的是:如果AppService的参数发生变化,那么使用到这个服务的所有地方,都需要进行修改,这不是我们想看到的结果。Angular中的依赖注入系统可以帮助我们改善这个局面。
服务的实例对象由Angular框架中内置的依赖注入系统创建和维护。服务是依赖需要被注入到组件中。
在组件中需要通过constructor构造函数的参数来获取服务的实例对象。
涉及参数就需要考虑参数的顺序问题,因为在Angular应用中会有很多服务,一个组件又不可能会使用到所有服务,如果组件要使用到最后一个服务实例对象,难道要将前面的所有参数都写上吗这显然不合理。
在组件中获取服务实例对象要结合TypeScript类型,写法如下。
import{AppService}from"./AppService"exportclassAppComponent{constructor(privateappService:AppService){}}为什么在形参前面加上private修饰符呢?appService只能在组件类当中使用,不能在组件模板中使用。
Angular会根据你指定的服务的类型来传递你想要使用的服务实例对象,这样就解决了参数的顺序问题。在Angular中服务被设计为单例模式,这也正是为什么服务可以被用来在组件之间共享数据和逻辑的原因。
第一种方式
npminit@angularproject-namecdproject-namenpmstart第二种方式
//enableProdMode方法调用后将会开启生产模式import{enableProdMode}from"@angular/core"//Angular应用程序的启动在不同的平台上是不一样的//在浏览器中启动时需要用到platformBrowserDynamic方法,该方法返回平台实例对象import{platformBrowserDynamic}from"@angular/platform-browser-dynamic"//引入根模块用于启动应用程序import{AppModule}from"./app/app.module"//引入环境变量对象{production:false}import{environment}from"./environments/environment"//如果当前为生产环境if(environment.production){//开启生产模式enableProdMode()}//启动应用程序platformBrowserDynamic().bootstrapModule(AppModule).catch(err=>console.error(err))
共享模块当中放置的是Angular应用中模块级别的需要共享的组件或逻辑。
@NgModule({declarations:[LayoutComponent],exports:[LayoutComponent]})exportclassSharedModule{}@NgModule({declarations:[AppComponent],imports:[SharedModule],bootstrap:[AppComponent]})exportclassAppModule{}@Component({selector:"app-root",template:`
数据绑定就是将组件类中的数据显示在组件模板中,当组件类中的数据发生变化时会自动被同步到组件模板中(数据驱动DOM)。
在Angular中使用插值表达式进行数据绑定,即双大括号语法{{}},也称大胡子语法。
{{message}}
{{getInfo()}}
{{a==b'相等':'不等'}}
{{'HelloAngular'}}
在插值语法中,不能使用ifelse语法;如果要显示字符串,需要用引号来包裹内容,否则它会认为这里是变量,是动态值。属性绑定分为两种情况:绑定DOM对象属性和绑定HTML标记属性。
homeworks!
import{AfterViewInit,ElementRef,ViewChild}from"@angular/core"exportclassHomeComponentimplementsAfterViewInit{@ViewChild("paragraph")paragraph:ElementRef- a
- b
- c
数据在组件类和组件模板中双向同步。Angular将双向数据绑定功能放在了@angular/forms模块中,所以要实现双向数据绑定需要依赖该模块。