Saya percaya bahwa maksud dari masukan AngularJS dan ngModel
arahannya adalah bahwa masukan yang tidak valid tidak boleh berakhir di model . Model harus selalu valid. Masalah dengan model yang tidak valid adalah bahwa kami mungkin memiliki pengamat yang menembak dan mengambil tindakan (tidak pantas) berdasarkan model yang tidak valid.
Seperti yang saya lihat, solusi yang tepat di sini adalah menyambungkan ke $parsers
pipa dan memastikan bahwa masukan yang tidak valid tidak masuk ke dalam model. Saya tidak yakin bagaimana Anda mencoba mendekati sesuatu atau apa yang sebenarnya tidak berhasil untuk Anda, $parsers
tetapi berikut adalah arahan sederhana yang menyelesaikan masalah Anda (atau setidaknya pemahaman saya tentang masalah tersebut):
app.directive('customValidation', function(){
return {
require: 'ngModel',
link: function(scope, element, attrs, modelCtrl) {
modelCtrl.$parsers.push(function (inputValue) {
var transformedInput = inputValue.toLowerCase().replace(/ /g, '');
if (transformedInput!=inputValue) {
modelCtrl.$setViewValue(transformedInput);
modelCtrl.$render();
}
return transformedInput;
});
}
};
});
Segera setelah direktif di atas dideklarasikan, dapat digunakan seperti ini:
<input ng-model="sth" ng-trim="false" custom-validation>
Seperti dalam solusi yang diusulkan oleh @Valentyn Shybanov, kita perlu menggunakan ng-trim
arahan jika kita ingin melarang spasi di awal / akhir input.
Keuntungan dari pendekatan ini adalah 2 kali lipat:
- Nilai yang tidak valid tidak disebarkan ke model
- Menggunakan arahan, mudah untuk menambahkan validasi kustom ini ke masukan apa pun tanpa menduplikasi pengamat berulang kali