import { Component, Input, Output, EventEmitter, forwardRef, Optional, ElementRef, ViewEncapsulation, OnInit } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { RadioGroupComponent } from './radio-group.component';
import { HostBinding } from '@angular/core';
@Component({
selector: 'farris-radio-button',
template: `
`,
styles: [
`
.farris-radio-button>.btn{
margin-left:-1px
}
.farris-radio-button>.btn.active, .farris-radio-button>.btn:hover{
position: relative;
}
`
],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RadioButtonComponent),
multi: true,
}],
encapsulation: ViewEncapsulation.None
})
export class RadioButtonComponent implements ControlValueAccessor, OnInit {
/* radio 原生name 用于多个radio单选使用 */
// get name() {
// }
name = '';
/* 按钮类型 */
@Input()
type = 'secondary';
/* radio 值 */
@Input()
get model(): any {
if (this.hasParent(this.el.nativeElement)) {
return this.radioGroup.model;
}
return this.nyModel;
}
set model(model: any) {
this.nyModel = model;
}
@Input()
id: string;
/* radio 值 */
@Input()
label: any = '';
/* 禁用 */
@Input()
disabled: boolean;
nyModel: any;
@Output()
modelChange = new EventEmitter();
@HostBinding('class.farris-radio-button')
get farrisRadioButtonClass() { return true; }
constructor(
@Optional() public radioGroup: RadioGroupComponent,
private el: ElementRef
) {
}
ngOnInit() {
this.name = this.hasParent(this.el.nativeElement) ? this.radioGroup.name : '';
}
isGroupModel() {
return this.label === this.radioGroup.model;
}
changeModelHandler() {
// 父元素获取label 子元素再从父元素获取model
if (this.hasParent(this.el.nativeElement)) {
return this.radioGroup.changeModel(this.label);
}
this.model = this.label;
this.modelChange.emit(this.model);
this.controlChange(this.label);
}
/* 是否存在父元素 存在即单选组*/
hasParent(element: any) {
return element.parentElement.classList.contains('farris-input-wrap') || element.parentElement.classList.contains('btn-group');
}
writeValue(value: any): void {
this.model = value;
}
registerOnChange(fn: Function): void {
this.controlChange = fn
}
registerOnTouched(fn: Function): void {
this.controlTouch = fn
}
private controlChange: Function = () => { }
private controlTouch: Function = () => { }
}