Бутстрап-пуговица угловая 5

Я пытаюсь реализовать http://www.bootstraptoggle.com/ в angular 5 без использования jquery и javascript.

Я использую директиву, заключенную в компонент, чтобы он выглядел правильно. Я нашел решение этой части здесь. Этот вариант наиболее целесообразен для меня, потому что он примерно такой же, как bootstrap-toggle.js.

Мне удалось настроить внешний вид, передав объект конфигурации, аналогичный параметрам, используемым в bootstrap-toggle. Единственное, чего сейчас не хватает, - это изменить значение ввода при переключении элемента. Вот Plunker того, что я сделал до сих пор. Есть два флажка, один из которых использует загрузочный тумблер, когда входное значение не обновляется, и один чистый флажок, который работает так, как я хочу, чтобы переключение было выполнено.

Вот компонент приложения:

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
      <form [formGroup]="form">
        <input type="checkbox" formControlName="toggle" *appToggle="{on:'Open', off:'Closed', width: '80px', onStyle: 'success', offStyle:'danger'}">
        <input type="checkbox" formControlName="clean">
      </form>
      Toggle: {{form.get('toggle').value}}<br>
      Clean: {{form.get('clean').value}}
    </div>
  `,
})

Это директива:

@Directive({
  selector: '[appToggle]'
})
export class ToggleDirective implements OnInit {
  options: Object;
  @Input() set appToggle(options: Object) {
    this.options = options || {};
  };

    private inputContainer: ComponentRef<ToggleWrapperComponent>;

    constructor(
        private templateRef: TemplateRef<any>,
        private viewContainerRef: ViewContainerRef,
        private componentFactoryResolver: ComponentFactoryResolver
    ) {}

    ngOnInit() {
        const containerFactory = this.componentFactoryResolver.resolveComponentFactory(ToggleWrapperComponent);
        this.inputContainer = this.viewContainerRef.createComponent(containerFactory);
        this.inputContainer.instance.template = this.templateRef;
        this.inputContainer.instance.options = this.options;
    }
}

И компонент оболочки:

@Component({
    selector: 'app-toggle-wrapper',
    template: `
    <ng-container #test *ngTemplateOutlet="template"></ng-container>
    <div class="toggle-group">
        <label class="btn toggle-on" [ngClass]="options.onStyle">{{options.on}}</label>
        <label class="btn active toggle-off" [ngClass]="options.offStyle">{{options.off}}</label>
        <span class="toggle-handle btn btn-default"></span>
    </div>
`,
    host: {
        '[class.toggle]' : 'true',
        '[class.btn]' : 'true',
        '[class.btn-primary]': 'true'
    }
})
export class ToggleWrapperComponent implements OnInit {
  @HostBinding('class.off') isOff = false;
  @HostListener('click') toggleOn() {
    this.isOff = !this.isOff;
  }

    @Input() template: TemplateRef<any>;
    @Input() options: Object;

    constructor(private element: ElementRef, private renderer: Renderer2) {}

    ngOnInit() {
      this.isOff = this.options.start || true;
        this.options.on = this.options.on || 'On';
        this.options.off = this.options.off || 'Off';
        this.options.width = this.options.width || '100px';
        this.options.height = this.options.height || '34px';
        if(this.options.onStyle) { 
          this.options.onStyle = {['btn-' + this.options.onStyle] : true} 
        } else {
          this.options.onStyle = {'btn-primary': true};
        }
        if(this.options.offStyle) { 
          this.options.offStyle = {['btn-' + this.options.offStyle] : true} 
        } else {
          this.options.offStyle = {'btn-default': true};
        }
        let elem = this.element.nativeElement;
        this.renderer.setStyle(elem, "width", this.options.width);
        this.renderer.setStyle(elem, "height", this.options.height);
    }
}

Можно ли получить дескриптор элемента ввода в компоненте-обертке для изменения ввода или мне нужно использовать EventEmitter для передачи изменения в родительский компонент, и как мне это сделать?

0 ответов

Другие вопросы по тегам