2016-05-14 105 views
1

我正在編寫一個應該只允許使用特定數字格式的組件,它除了一件事情外很好,它每次都會切片,但每隔兩次更新視圖。所以,如果我把它寫在這個序列:儘管每次都運行,但每隔兩次只切分一次值

一個 乙 Ç d

我結束了BD。

我不明白這裏發生了什麼。

這是組件:

@Component({ 
    selector: 'my-input', 
    templateUrl: 'my-input.html', 
    styleUrls: ['my-input.css'], 
    inputs: [ 
    'model', 
    'pattern' 
    ], 
    host: { 
    '(input)': 'isNum($event.target.value)' 
    }, 
    providers: [ 
    RegexService 
    ] 
}) 

export class FormNumberInputComponent { 
    @Input() model: number; 
    @Output('modelChange') onModelChange: EventEmitter<any> = new EventEmitter(); 

    constructor(private _regexes: RegexService) {} 

    isNum(value) { 

    this.isInvalid = !this._regexes.test(this.pattern || 'integer', value); 

    if (!this.isInvalid) { 
     this.onModelChange.emit(value); 
    } 
    else { 

     value = value.slice(0, -1); 

     // This also doesn't work, gives the same result 
     value = value.substring(0, -1); 

     this.onModelChange.emit(value); 
    } 
    } 
} 

而簡單的模板:

<input [(ngModel)]="model"> 

從父組件使用這樣的:

<my-input [(model)]="myModel1"></my-input> 
+0

我注意到你正在使用'切片'在代碼中,但在你的問題,你說你是'剪接'。這是我想的問題,因爲slice會返回一個全新的數組,而不是像'splice'那樣就地改變它。 – Abdulrahman

+0

@Abdulrahman對不起,這是一個錯字。感謝您指出。我會嘗試子串作爲拼接不起作用的字符串。 – Chrillewoodz

+0

@Abdulrahman與子字符串相同的結果。 – Chrillewoodz

回答

2

試試這個:

this.onModelChange.emit(new String(value)); 

enter image description here

這裏對應plunker https://plnkr.co/edit/2KqCGggSDOdXhjiJEw68?p=preview

我會寫的,而不是組件的驗證定製管爲:https://plnkr.co/edit/xCvnJ9682lV0Z1sBcK68?p=preview

也許這也將是有趣的http://blog.jhades.org/how-does-angular-2-change-detection-really-work/

+0

生病了,你只需將我的20班輪劃分爲1行。面對一個負值和分隔符的問題,例如點,逗號和連字符,但因爲它會在計數爲0之前變爲無效,例如在寫入0.1之前。任何想法如何實現這個到你的答案? – Chrillewoodz

+0

那個圖像是什麼意思? – Chrillewoodz

+0

@Chrillewoodz我已經更新了第一個問題的解決方案 – yurzui