zoukankan      html  css  js  c++  java
  • [Angular] Creating an Observable Store with Rx

    The API for the store is really simple:

    /*
       set(name: string, state: any);
    
       select<T>(name: string): Observable<T> 
    */

    There are two methods, set() & select(). 

    Store:

    import {Observable} from 'rxjs/Observable';
    import {BehaviorSubject} from 'rxjs/BehaviorSubject';
    import {IState} from './state';
    import 'rxjs/add/operator/pluck';
    import 'rxjs/add/operator/distinctUntilChanged';
    
    const state: IState = {
      playList: undefined
    };
    
    export class Store {
      /*Because store usually has a default value, BehaviorSubject is suitable for that*/
      private subject = new BehaviorSubject<IState>(state);
    
      /*Create a observable store*/
      private store = this.subject
        .asObservable() // convert to an observable
        .distinctUntilChanged(); // performance improve
    
      /*Get value from subject*/
      get value() {
        return this.subject.value;
      }
    
      set(name: string, state: any) {
        const nextState = {
          ...this.value,
          [name]: state
        };
        this.subject.next(nextState);
      }
    
      select<T>(name: string): Observable<T> {
        // get prop value from observable
        return this.store.pluck(name);
      }
    
    }

    interface:

    export interface IState {
      playList: any[]
    }

    Component:

    import { Component } from '@angular/core';
    import {Store} from './store';
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent {
      todos$ = this.store.select<any[]>('todos');
    
      constructor(private store: Store) {
        this.store.set('todos', [
          {id: 1, name: 'Learning Angular'},
          {id: 2, name: 'Learning Redux'}
        ]);
      }
    }
    <div>
      <ul *ngFor="let todo of todos$ | async">
        <li>{{todo.name}}</li>
      </ul>
    </div>
  • 相关阅读:
    logging日志模块
    mysql数据库--explain(查询表是否走索引)各个字段含义
    函数的命名空间、作用域、闭包函数
    模块
    Hibernate Stack Overflow
    PostgreSQL ----- No relations found.
    spring杂记
    JUnit test case 执行顺序
    转换成maven时报错
    参考网页
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6948837.html
Copyright © 2011-2022 走看看