避免两个相同的组件相互改变Angular

时间:2017-09-19 19:55:07

标签: javascript angular typescript components

我有一个Tabs的组件,它有自己的变量,它的工作非常好,但问题是,如果我再次将其他选项卡放在同一页面中,当我将所选选项卡的值更改为一个时,它也会更改其他标签组件。

这是我的标签组件:

@Component({
  selector: 'sys-tab',
  styleUrls: ['./shared/sys.css'],
  template: `
    <div class="tabs">
      <div *ngFor="let tab of tabs; let i = index" (click)="selectTab(tab)">
        <input id="tab-{{i+1}}" type="radio" name="radio-set" class="tab-selector-{{i+1}}" [checked]="i===0"/>
        <label for="tab-{{i+1}}" class="tab-label-{{i+1}}">{{tab.title}}</label>
      </div>
      <div class="content">
         <ng-content></ng-content>
      </div>
    </div>
  `,
})

export class TabView {
  tabs: TabViewContent[] = [];
  addTab(tab: TabViewContent) {
    if (this.tabs.length === 0)
      tab.active = true;
    this.tabs.push(tab);
  }

  selectTab(tab) {
    this.tabs.forEach((tab) => {
      tab.active = false;
    });
    tab.active = true;
  }
}

@Component({
  selector: 'sys-tab-content',
  styleUrls: ['./shared/sys.css'],
  template: `    
      <div class="content-2" [hidden]="!active">
        <ng-content></ng-content>
      </div>
   `
})
export class TabViewContent {

  active: boolean;

  @Input() title: string;

  constructor(tabs: TabView) {
    tabs.addTab(this);
  }

}

如果我以这种方式使用它,它的效果非常好:

<sys-tab>
  <sys-tab-content title="Principal">
   Content 1
  </sys-tab-content>
  <sys-tab-content title="Complementar">
   Content 2
  </sys-tab-content>
</sys-tab>

但如果我做这样的事情:

<sys-tab>
      <sys-tab-content title="Principal">
         Content 1
      </sys-tab-content>
     <sys-tab-content title="Complementar">
           Content 2
       </sys-tab-content>
    </sys-tab>
<sys-tab>
      <sys-tab-content title="Principal">
         Content 3
      </sys-tab-content>
     <sys-tab-content title="Complementar">
           Content 4
       </sys-tab-content>
    </sys-tab>

当我更改第一个组件的值时,它也会更改第二个组件的值,反之亦然。

1 个答案:

答案 0 :(得分:1)

您应为每个input[radio]组指定不同的名称:

name="{{id}}-radio-set"

所有控件的唯一idfor属性。

所以这是如何做到的:

let nextId = 0;

@Component({
  selector: 'sys-tab',
  template: `
      ...
        <input id="{{id}}-tab-{{i+1}}" ... name="{{id}}-radio-set" .../>
        <label for="{{id}}-tab-{{i+1}}" ...></label>
      ...
  `,
})
export class TabView {
  id = `tabview-${nextId++}`;

<强> Plunker Example