Str*_*der 26 typescript typescript-generics angular-components angular
是否可以在Angular 4中声明具有泛型类型的组件?
以下代码导致生成错误:
export class MyGenericComponent<T> implements OnInit {
    @Input()  data: BehaviorSubject<T[]>;
    //...
}
执行时的错误ng serve是:
ERROR in C:/.../my-generic.module.ts (5,10): Module '"C:/.../my-generic.component"' has no exported member 'MyGenericComponent'.
例:
以下示例是尝试实现通用数据表,其中@Input() data从一个组件"调用此组件"到另一个组件的更改.现在的问题是可以BehaviorSubject<any[]>被改变到BehaviorSubject<T[]>哪里T会是泛型类型传递到组件?
@Component({
  selector: 'my-data-list',
  templateUrl: './data-list.component.html',
  styleUrls: ['./data-list.component.css']
})
export class DataListComponent implements OnInit {
  @Input()  data: BehaviorSubject<any[]>;
  @Output() onLoaded = new EventEmitter<boolean>();
  private tableDataBase : TableDataBase = new TableDataBase();
  private dataSource : TableDataSource | null;
  constructor() { }
  ngOnInit() {
    this.tableDataBase.dataChange = this.data;
    this.dataSource = new TableDataSource(this.tableDataBase);
    this.onLoaded.emit(true);
  }
}
class TableDataBase {
  dataChange: BehaviorSubject<any[]> = new BehaviorSubject<any[]>([]);
  get data(): any[] {
    return this.dataChange.value;
  }
}
class TableDataSource extends DataSource<any> {
  constructor(private tableDataBase: TableDataBase) {
    super();
  }
  connect(): Observable<any[]> {
    return Observable.of(this.tableDataBase.data);
  }
  disconnect() {}
}
Mat*_*ger 15
您还可以通过ViewChild访问Type参数,如下所示:
export class Bazz {
  name: string;
  constructor(name: string) {
    this.name = name;   
  }
}
@Component({
  selector: 'app-foo',
  template: `<div>{{bazz?.name}}</div>`,
  exportAs: 'appFoo'
})
export class FooComponent<T> {
  constructor() {}
  private _bazz: T;
  set bazz(b: T) {
    this._bazz = b;
  }
  get bazz(): T {
   return this._bazz;
  }
}
@Component({
  selector: 'app-bar',
  template: `<app-foo #appFoo></app-foo>`,
  styleUrls: ['./foo.component.scss'],
})
export class BarComponent<T> implements OnInit {
  @ViewChild('appFoo') appFoo: FooComponent<Bazz>;
  constructor() {}
  ngOnInit() {
    this.appFoo.bazz = new Bazz('bizzle');
    console.log(this.appFoo.bazz);
  }
}
您可以声明它,但不能直接使用它.你可以这样做:
export abstract class Form<T> implements OnInit, OnChanges {
  someMethod() { throw 'Dont use directly' }
  otherMethod() { return 'Works!'; }
  // Note that below will cause compilation error
  //   TypeError: Object prototype may only be an Object or null: undefined
  // You cannot use protected in this usecase
  protected anotherMethod() { }
}
@Component({})
export class ModelOneForm extends Form<ModelOne> {
  someMethod() { return this.otherMethod(); }
}
| 归档时间: | 
 | 
| 查看次数: | 15390 次 | 
| 最近记录: |