我使用此解决方案Angular2 - Radio Button Binding进行单选按钮绑定。它在RC1下运行良好。
但是当我升级到Angular2 RC2时。存在编译错误
app/shared/services/radio.value.accessor.ts(22,5): error TS2345:
Argument of type '{ selector: string;
host: { [x: string]: string; '(change)': string; '(blur)': string; };
binding...'
is not assignable to parameter of type '{ selector?: string;
inputs?: string[];
outputs?: string[];
properties?: string[];
events?: strin...'.
Object literal may only specify known properties, and 'bindings' does not exist in type
'{ selector?: string;
inputs?: string[];
outputs?: string[];
properties?: string[];
events?: strin...'.
代码如下所示。
import {Directive, Renderer, ElementRef, forwardRef} from '@angular/core';
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/common';
export const RADIO_VALUE_ACCESSOR: any = /*@ts2dart_const*/ {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RadioControlValueAccessor),
multi: true
};
/**
* The accessor for writing a value and listening to changes on a radio input element.
*
* ### Example
* ```
* <input type="radio" ngModel="radioModel">
* ```
*/
@Directive({
selector: 'input[type=radio][ngControl],input[type=radio][ngFormControl],input[type=radio][ngModel]',
host: {'(change)': 'onChange($event.target.value)', '(blur)': 'onTouched()'},
bindings: [RADIO_VALUE_ACCESSOR]
})
export class RadioControlValueAccessor implements ControlValueAccessor {
onChange = (_:any) => {} ;
onTouched = () => {};
constructor(private _renderer: Renderer, private _elementRef: ElementRef) {}
writeValue(value: any): void {
this._renderer.setElementProperty(this._elementRef.nativeElement, 'checked', value == this._elementRef.nativeElement.value);
}
registerOnChange(fn: (_: any) => {}): void { this.onChange = fn; }
registerOnTouched(fn: () => {}): void { this.onTouched = fn; }
}
知道怎么解决这个问题吗?
或RC2是否包含单选按钮绑定方式,我不必使用外部代码?如果是这样的话?
答案 0 :(得分:2)
我认为RC2中仍有bindings
,请看一下:
export interface ComponentMetadataFactory {
(obj: {
selector?: string;
inputs?: string[];
outputs?: string[];
properties?: string[];
events?: string[];
host?: {
[key: string]: string;
};
bindings?: any[];
providers?: any[];
exportAs?: string;
moduleId?: string;
queries?: {
[key: string]: any;
};
viewBindings?: any[];
viewProviders?: any[];
changeDetection?: ChangeDetectionStrategy;
templateUrl?: string;
template?: string;
styleUrls?: string[];
styles?: string[];
directives?: Array<Type | any[]>;
pipes?: Array<Type | any[]>;
encapsulation?: ViewEncapsulation;
}): ComponentDecorator;
new (obj: {
selector?: string;
inputs?: string[];
outputs?: string[];
properties?: string[];
events?: string[];
host?: {
[key: string]: string;
};
bindings?: any[];
providers?: any[];
exportAs?: string;
moduleId?: string;
queries?: {
[key: string]: any;
};
viewBindings?: any[];
viewProviders?: any[];
changeDetection?: ChangeDetectionStrategy;
templateUrl?: string;
template?: string;
styleUrls?: string[];
styles?: string[];
directives?: Array<Type | any[]>;
pipes?: Array<Type | any[]>;
encapsulation?: ViewEncapsulation;
}): ComponentMetadata;
}
答案 1 :(得分:1)
更改
@Directive({
selector: 'input[type=radio][ngControl],input[type=radio][ngFormControl],input[type=radio][ngModel]',
host: {'(change)': 'onChange($event.target.value)', '(blur)': 'onTouched()'},
bindings: [RADIO_VALUE_ACCESSOR]
})
到
@Directive({
selector: 'input[type=radio][ngControl],input[type=radio][ngFormControl],input[type=radio][ngModel]',
host: {'(change)': 'onChange($event.target.value)', '(blur)': 'onTouched()'},
providers: [RADIO_VALUE_ACCESSOR]
})
现在工作正常。感谢AngJobs提供改变的线索。