Saya percaya bahwa maksud dari masukan AngularJS dan ngModelarahannya 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 $parserspipa 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, $parserstetapi 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-trimarahan 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