angular--Observable总结

Observable的通俗理解


Observable在消息发布者和观察者Observer之间起到一个媒体中介的作用,Observer是真正需要接受信息的人。Observable的实例提供了一个订阅函数,subscribe()。当Observable的实例接收到信息时,将Observer作为参数传递给subscribe(),也就是通过subscribe()函数通知Observer,Observer接到通知后,使用next()方法再通知Observable()表示可以传数据了,然后Observer可以一直接收到数据,直到发生error(),或是数据接收完成,complete();

创建Observable对象的几种情形


  1. 通过promise创建
	import {fromPromise} from 'rxjs';
    	const data = fromPromise(fetch('api/endpoint'));
    	data.subscribe({
    	next(response){
        console.log(response);
    	},
    	error(err){
        	console.error('Error' + err);
    	},
    	complete(){
        	console.log('Completed');
    	}
	});
  1. 通过counter创建
	import {interval} from 'rxjs';
	//创建一个将要在计时器上发布值的Observable
	const secondsCounter = interval(1000);
	//开始发布值
	secondsCounter.subscribe(n =>
	console.log(`It is been ${n} seconds since subscribeing`));
  1. 通过事件创建
	import {fromEvent} from 'rxjs';
	const el = document.getElementById('my-element');
	const mouseMoves = fromEvent(el,'mousemove');
	const subscription = mouseMoves.subscribe((evt:MouseEvent)=>{
    	console.log(`Cooeds:${evt.clientX} X ${evt.clientY} `);
    	if(evt.clientX <40 && evt.clientY <40){
        	subscription.unsubscribe();
    	}
	});

4.通过ajax创建

	import {ajax} from 'rxjs/ajax';
	const apiData = ajax('/api/data');
	apiData.subscribe(res =>console.log(res.status,res.response));

angular中用到的Observable


  • EventEmitter:它是继承于Observable的,但是又有了自己的emit(),用来将要发送的值传递给 observer.next();如下代码:
//html文件
<zippy (open)="onOpen($event)" (close)="onClose($event)"></zipppy>
//ts文件
@Component({
   selector: 'zippy',
   template: `
   <div class="zippy">
   <div (click)="toggle()">Toggle</div>
    <div [hidden]="!visible">
       <ng-content></ng-content>
    </div>
   </div>`})
export class ZippyComponent {
    visible = true;
    @Output() open = new EventEmitter<any>();
    @Output() close = new EventEmitter<any>();
  toggle() {
     this.visible = !this.visible;
     if (this.visible) {
        this.open.emit(null);
     } else {
        this.close.emit(null);
   }
}
  • HttpClient:它从 HTTP 方法调用中返回了可观察对象。例如,http.get(‘/api’) 就会返回可观察对象
getHeroes(): Observable<Hero[]> {
    // this.messageService.add('HeroService:fetched heroes');//发送数据到缓存中
    // return of(HEROES);
    // 这里可以改成HttpClient.get<Hero[]>这里也会返回一个Observable<Hero[]>
    // 采用RxJS中的of()方法模拟获取数据
    return this.http.get<Hero[]>(this.heroesUrl)
      .pipe(
        tap(heroes => this.log(`fetched heroes`)),
        catchError(this.handleError('getHeroes', []))
      );
  • router:ActivatedRoute 是一个可注入的路由器服务,它使用Observable来获取关于路由路径和路由参数的信息;如:
    import { ActivatedRoute } from '@angular/router';
    @Component({
      selector: 'app-routable',
      templateUrl: './routable.component.html',
      styleUrls: ['./routable.component.css']
    })
    export class Routable2Component implements OnInit {
      constructor(private activatedRoute: ActivatedRoute) {}
      ngOnInit() {
        this.activatedRoute.url
          .subscribe(url => console.log('The URL changed to: ' + url));
      }
    }
  • reactive forms:响应式表单,表单有些属性用Observable来监听表单控件的值;FormControl 的 valueChanges和 statusChanges 包含了会发出变更事件的Observable,如图:
    import { FormGroup } from '@angular/forms';
    @Component({
      selector: 'my-component',
      template: 'MyComponent Template'
    })
    export class MyComponent implements OnInit {
      nameChangeLog: string[] = [];
      heroForm: FormGroup;
      ngOnInit() {
        this.logNameChange();
      }
      logNameChange() {
        const nameControl = this.heroForm.get('name');
        nameControl.valueChanges.forEach(
          (value: string) => this.nameChangeLog.push(value)
        );
      }
    }

参考:angular官方文档

转载于:https://my.oschina.net/hyzccc/blog/1841860

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值