Angular 2制作一个" generic"两个几乎相同的组件中的组件

时间:2016-02-25 08:12:24

标签: angular

我有两个几乎相同的组件,对于代码可重用性,我想将它们组合在一起,以便在我的项目中的不同位置使用。两者都是带有复选框的下拉列表。唯一不同的是进出的数据。

import {ROUTER_DIRECTIVES, RouteConfig, RouteParams, Router, RouterOutlet, RouterLink} from 'angular2/router';
import {FORM_PROVIDERS, FORM_DIRECTIVES, Control, NgClass, NgIf, CORE_DIRECTIVES} from 'angular2/common';
import {Component, Inject, Input, OnInit, OnChanges} from 'angular2/core';
import {Http, Headers, ContentHeaders, HTTP_PROVIDERS} from 'angular2/http';
import {User} from '/app/interfaces';
import {ActualsComponent } from '../actuals/actual.component';
import {ProjectService} from '../../projects/project.service';
import {LoginService} from '../../login/login.service';
import {SearchPipe} from '../custom-pipes/search-pipe';

@Component({
    selector: 'dropdown-users',
    templateUrl: 'app/templates/elements/dropdown-users.html',
    providers: [FORM_PROVIDERS, HTTP_PROVIDERS, ProjectService, LoginService],
    directives: [ROUTER_DIRECTIVES, FORM_DIRECTIVES, RouterLink, CORE_DIRECTIVES, RouterOutlet],
    pipes: [SearchPipe]
})

export class DropDownUsers implements OnInit, OnChanges{
    projectdata: Object;
    selectedUsers: Object;

    public showMenu: boolean;
    projectSearchTerm: Control = new Control();
    projectcount: number;

    constructor(@Inject(ProjectService) projectService: ProjectService, @Inject(LoginService) loginService: LoginService, private http: Http,  params: RouteParams) {
        this.showMenu = false;
        loginService.authenticate("user", "pwd");
        this.projectdata = loginService.data;
        this.projectcount = 0;
        this.selectedUsers = new Array();

    }
    addUser(user: User){
        this.selectedUsers.push(user);
    }
}

另一个组件是相同的,除了它与用户而不是项目一起使用。

1 个答案:

答案 0 :(得分:2)

您可以创建具有常用功能的基类,并在希望继承常见事物或更改/覆盖特定内容时对其进行扩展。

class Base {
  selected: any[];
  constructor(DI_ARGS) {
    this.selected = [];
  }
  add(o) { this.selected.push(o); }
}

@Component({ template: `
  <button (click)="add('Mike')">Add User</button>
  <p>selected users: <a *ngFor="#user of selected">{{ user }}, </a></p>
` })
class Users extends Base {
  constructor(DI_ARGS) {
    super(DI_ARGS);
  }
}

@Component({ template: `
  <button (click)="add('build house')">Add Project</button>
  <p>selected projects: <a *ngFor="#project of selected">{{ project }}, </a></p>
` })
class Project extends Base {
  constructor(DI_ARGS) {
    super(DI_ARGS);
  }
}

有一些警告:'

  • 您不能在基类中使用装饰器
  • 要使用依赖项注入,必须通过super()
  • 提供构造函数参数
  • 您可以(默认情况下)只扩展一个类