0.2.6 • Published 5 years ago

ts-observer v0.2.6

Weekly downloads
66
License
-
Repository
-
Last release
5 years ago

响应式状态

基于rxjs + proxy代理的方式实现响应式观察,监听对象属性的变化(可以监听嵌套对象属性变化,新增、删除属性行为,及数组的变化),自动实例化BehaivorSubject,并自动next更新。外部只需订阅响应式对象即可获取变更通知

import {Injectable} from '@angular/core';

import {Observable} from 'rxjs';
import {Observer} from 'ts-observer';

@Injectable({
  providedIn: 'root'
})
export class RxjsProxyService {

  user$: Observable<any>;

   @Observer('user$') user = {
      name: 'alvin',
      score: 0,
      friend: {
        name: 'maksim',
        score: 0
      },
      friendList: [
        {
          name: 'alvin1',
          score: 0
        },
        {
          name: 'alvin2',
          score: 0
        },
        {
          name: 'alvin3',
          score: 0
        }
      ]
    };   

  arr$: Observable<any>;

  @Observer('arr$') arr = [];

  addScore() {
    this.user.score++;
  }

  updateArr() {
    this.arr.push(1);
  }


}

import {ChangeDetectionStrategy, Component} from '@angular/core';
import {Observable} from 'rxjs';
import {RxjsProxyService} from './rxjs-proxy.service';

@Component({
  selector: 'app-rxjs-proxy',
  template: `
    <nz-card>
      {{(user$|async)?.name}}
      {{(user$|async)?.score}}
    </nz-card>
    <nz-card>
      <nz-tag *ngFor="let item of arr$|async">{{item}}</nz-tag>
    </nz-card>
    <br>
    <button nz-button (click)="rxjsProxyService.addScore()">加分</button>
    <button nz-button (click)="rxjsProxyService.updateArr()">改变数组</button>
  `,
  styleUrls: ['./rxjs-proxy.component.less'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class RxjsProxyComponent {

  user$: Observable<any>;
  arr$: Observable<any>;

  constructor(public rxjsProxyService: RxjsProxyService) {
    this.user$ = this.rxjsProxyService.user$;
    this.arr$ = this.rxjsProxyService.arr$;
  }
}

也支持简单回调的方式

  • 使用方法,给需要观察的对象写上注解即可,注解中的参数为回调方法,大致如下:
export class DemoComponent implements OnInit{
    // 传入回调函数名称,装饰器会监听对象属性的变化,并自动执行回调 (场景:参数变化 自动加载数据)
    @OnDeepChange('load')
    params: any = {
      page: 1,
      size: 10,
      other:{
        a:{
          b:3
        }
      }
    };
  
    load() {
      // ... 自动加载数据
      console.log('【查看现在的参数】', this.params);
    }
  
    changePage() {
      this.params.page++;
    }
  
    ngOnInit() {
      this.changePage(); // page = 2
      this.changePage(); // page = 3
      this.changePage(); // page = 4
      this.changePage(); // page = 5   
      
      this.params.other.a.b=4; // b = 4 
    }
}
0.2.6

5 years ago

0.2.5

5 years ago

0.2.4

5 years ago

0.2.3

5 years ago

0.2.2

5 years ago

0.2.1

5 years ago

0.2.0

5 years ago

0.1.1

5 years ago

0.1.0

5 years ago

0.0.8

5 years ago

0.0.7

5 years ago

0.0.6

5 years ago

0.0.5

5 years ago

0.0.4

5 years ago

0.0.3

5 years ago

0.0.2

5 years ago