【问题标题】:angular2 how to use complex observable without duplicate subscriptionangular2 如何在没有重复订阅的情况下使用复杂的 observable
【发布时间】:2016-02-16 06:15:56
【问题描述】:

我有一个类 Page(定义如下)和服务,它返回一个可观察的 Page。如何在没有重复订阅的情况下正确使用 observable。 Plunker(不工作)http://plnkr.co/edit/8xwclHsGm2jKdW9A0fZ4?p=preview

export class Page<T>{
  content: Array<T> = new Array();
  last: boolean = true;
  totalPages: number = 0;
  totalElements: number = 0;
  size: number = 0;
  number: number = 0; // Page number
  first: boolean = true;
  numberOfElements: number = 0; //Number of elements in current page
}


export class DataGridService {
  getPageForGrid(gridName:string):Observable<Page<any>>{
    return anObservable; //code removed. see plunker
  }
}


@Component({
    selector: 'data-grid',
    changeDetection: ChangeDetectionStrategy.OnPush,
    template: `<div class="row">
  <ul>
    <li>Page size: {{page.size}}</li>
    <li>Number: {{page.number}}</li>
    <li>Total pages: {{page.totalPages</li>
    <li>Total Elements: {{page.totalElements}}</li>
    <li>Number of elements:{{page.numberOfElements}}</li>
  </ul>
  <div>
    <table>
      <tbody>
        <tr *ngFor="#row of page.content; #i = index">
          <td>{{row['column1']}}</td>
          <td>{{row['column2']}}</td>
        </tr>
      </tbody>
    </table>
  </div>
</div>`,
providers:[DataGridService]
})
export class DataGridComponent {
  @Input gridName: string;

  page: Observable<Page<any>>;

  constructor(){
    this.dataGridService = new DataGridService();
  }

  ngOnChanges(changes){
    this.page = this.dataGridService.getPageForGrid(this.gridName);
  }
}

【问题讨论】:

    标签: angular observable


    【解决方案1】:

    我对你的代码做了一些修改,你可以看到working plunker here

    正如您在此处看到的,Observable 一点也不复杂,它并不关心它发出什么类型的数据。它可以是简单的字符串、数据对象(如您的情况)或其他任何东西。

    我建议您使用 Observable 作为生成器,就像我使用 Observable.of() 所做的那样,不要使用 new Observable(),至少在您真正了解它是如何工作之前...

    @Injectable()
    export class DataGridService {
      getPageForGrid(gridName:string):Observable<Page<any>>{
      var page = new Page();
          page.size = 2;
          page.totalPages = 10;
          page.totalElements=19;
          page.numberOfElements=2;
          page.content = [{column1:"11", column2:"12"},{column1:"21", column2:"22"}];
    
        return Observable.of(page));
      }
    }
    
    @Component(...)
    export class DataGridComponent {
      constructor(public dataGridService: DataGridService){
        this.dataGridService.getPageForGrid(this.gridName)
          .subscribe(page => this.page = page);
      }
    }
    

    【讨论】:

    • 这段代码我认为不再使用 DataGridComponent 中的页面作为可观察的。 “页面”现在看起来像 Page 的普通实例。在plnkr.co/edit/G5iiwV?p=preview 将修改后的代码视为 plunker,这不起作用,因为 ChangeDetectionStrategy 是 Push。如果您从组件定义中删除“changeDetection:ChangeDetectionStrategy.OnPush”,那么它将起作用。但我希望 OnPush 能够工作。
    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 2018-02-11
    • 2021-04-02
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多