Developing Radio Buttons Directive
Basic styles provided by Bootstrap
Bootstrap provides basic styles for radio buttons with btn-group and btn class.
<div class="btn-group" role="group">
  <button type="button" class="btn btn-primary">Left</button>
  <button type="button" class="btn btn-primary">Middle</button>
  <button type="button" class="btn btn-primary">Right</button>
</div>
It looks like this:

Then we are going to complete a radio buttons directive named myRadioGroup with Angular. 
It will manage radio status and bind value for Template-driven form and Reactive form.
First of all, create directive files with @angular/cli

Create our first test to make sure that the directive can be create.
  it('should create', () => {
    fixture = createGenericTestComponent(`
      <div class="btn-group" myRadioGroup>
        <button type="button" class="btn btn-primary">Left</button>
        <button type="button" class="btn btn-primary">Middle</button>
        <button type="button" class="btn btn-primary">Right</button>
      </div>
    `, TestComponent);
    component = fixture.componentInstance;
    expect(component).toBeTruthy('test component is created');
    expect(component.instance).toBeTruthy('directive is created');
  });
The RadioGroup should contains children directives named myRadio that manage status of single button.

  it('should create', () => {
    fixture = createGenericTestComponent(`
      <button type="button" myRadio class="btn btn-primary">Radio</button>
    `, TestComponent);
    component = fixture.componentInstance;
    instance = component.instance;
    expect(component).toBeTruthy('component is created');
    expect(instance).toBeTruthy('myRadio is created');
  });
When the button is clicked, it will be active
  it('should switch `active` when clicking', () => {
    fixture = createGenericTestComponent(`
      <button type="button" myRadio class="btn btn-primary">Radio</button>
    `, TestComponent);
    component = fixture.componentInstance;
    instance = component.instance;
    const btn = getButton(fixture);
    btn.nativeElement.click();
    expect(btn.nativeElement.classList).toContain('active');
    btn.nativeElement.click();
    expect(btn.nativeElement.classList).not.toContain('active');
  });
Implements:
@Directive({
  selector: '[myRadio]'
})
export class MyRadioDirective {
  private isActive: boolean;
  constructor(
    private elementRef: ElementRef,
    private renderer: Renderer
  ) { }
  @HostListener('click') onclick() {
    this.isActive = !this.isActive;
    this.renderer.setElementClass(this.elementRef.nativeElement, 'active', this.isActive);
  }
}
- isActive - save current button status.
- elementRef: ElementRef - injected by Angular, reference to the button element.
- renderer: Renderer - injected by Angular, used to manage DOM element.
- setElementClass - add/remove class to specified DOM element depends on the third parameter.