2016-07-12 72 views
3

所以我有一個格式化值存取指令:自定義值訪問在Angular2

const CUSTOM_VALUE_ACCESSOR = new Provider(
    NG_VALUE_ACCESSOR, { useExisting: forwardRef(() => NumbersValueAccessor), multi: true }); 

@Directive({ 
    selector: 'input[format]', 
    host: { '(input)': 'onMyChange($event.target.value)' }, 
    providers: [CUSTOM_VALUE_ACCESSOR] 
}) 
export class NumbersValueAccessor extends DefaultValueAccessor { 
//... 
} 

然後我使用它像

@Component({ 
    templateUrl: 'frequencyPage.html' 
    , moduleId: module.id 
    , directives: [/*...*/ NumbersValueAccessor] 
}) 
export class FrequencyPage //... 

和HTML作爲

<input format="{number:true}" [(ngModel)]="test.alpha"/> 

它得到實例化的所有權利,但看着角JIT編譯的模板代碼:

self._DefaultValueAccessor_32_3 = new jit_DefaultValueAccessor3(self.renderer,new jit_ElementRef18(self._el_32)); 
    self._Token_NgValueAccessor_32_4 = [ 
    self._DefaultValueAccessor_32_3, 
    self._DefaultValueAccessor_32_3 
    ] 
    ; 
    self._NgModel_32_5 = new jit_NgModel5(null,null,null,self._Token_NgValueAccessor_32_4); 
    self._NgControl_32_6 = self._NgModel_32_5; 
    self._NgControlStatus_32_7 = new jit_NgControlStatus7(self._NgControl_32_6); 
    self._NumbersValueAccessor_32_8 = new jit_NumbersValueAccessor8(self.renderer,new jit_ElementRef18(self._el_32)); 

它是在ngModel之後創建的,因此不會傳遞給它,因此,當我實際編輯輸入時,它是被調用的默認值訪問器。 我在想什麼?


編輯:有一件事,我發現:如果不是延長DefaultValueAccessor我從頭開始重新實現ControlValueAccessor,它的工作原理。 它是在angular2的模板編譯器中的錯誤?

回答

1

它是在angular2的模板編譯器中的錯誤?

是的,它是,目前已經有多個問題在github上:

https://github.com/angular/angular/issues/9146#issuecomment-230410616

這似乎是裝飾不能覆蓋angular2類的元數據。這是與此相關的元數據錯誤


更多的問題:

https://github.com/angular/angular/issues/9758

https://github.com/angular/angular/issues/8925

+1

好了,有了一個簡單的解決方法和存在的問題在github上,我的工作已經做了:) – TDaver