Salah satu hal menarik yang dapat dilakukan AngularJS adalah menerapkan filter ke ekspresi penyatuan data tertentu, yang merupakan cara mudah untuk menerapkan, misalnya, mata uang khusus budaya atau format tanggal properti model. Ini juga bagus untuk memiliki properti yang dihitung pada ruang lingkup. Masalahnya adalah bahwa tidak satu pun dari fitur ini bekerja dengan skenario penyatuan data dua arah - hanya penyatuan data satu arah dari ruang lingkup ke tampilan. Ini tampaknya merupakan kelalaian yang mencolok di perpustakaan yang sangat bagus - atau apakah saya melewatkan sesuatu?
Di KnockoutJS , saya bisa membuat properti hitung baca / tulis, yang memungkinkan saya menentukan sepasang fungsi, yang dipanggil untuk mendapatkan nilai properti, dan yang dipanggil saat properti disetel. Hal ini memungkinkan saya untuk mengimplementasikan, misalnya, masukan yang sadar budaya - membiarkan pengguna mengetik "$ 1.24" dan menguraikannya menjadi pelampung di ViewModel, dan memiliki perubahan dalam ViewModel yang tercermin dalam masukan.
Hal terdekat yang bisa saya temukan mirip dengan ini adalah penggunaan $scope.$watch(propertyName, functionOrNGExpression);
This memungkinkan saya untuk memiliki fungsi yang dipanggil ketika properti dalam $scope
perubahan. Tapi ini tidak menyelesaikan, misalnya, masalah masukan sadar budaya. Perhatikan masalah ketika saya mencoba mengubah $watched
properti di dalam $watch
metode itu sendiri:
$scope.$watch("property", function (newValue, oldValue) {
$scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
$scope.property = Globalize.parseFloat(newValue);
});
( http://jsfiddle.net/gyZH8/2/ )
Elemen masukan menjadi sangat bingung saat pengguna mulai mengetik. Saya memperbaikinya dengan membagi properti menjadi dua properti, satu untuk nilai yang tidak diuraikan dan satu untuk nilai yang diuraikan:
$scope.visibleProperty= 0.0;
$scope.hiddenProperty = 0.0;
$scope.$watch("visibleProperty", function (newValue, oldValue) {
$scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
$scope.hiddenProperty = Globalize.parseFloat(newValue);
});
( http://jsfiddle.net/XkPNv/1/ )
Ini adalah peningkatan dari versi pertama, tetapi sedikit lebih bertele-tele, dan perhatikan bahwa masih ada masalah parsedValue
properti perubahan lingkup (ketik sesuatu di masukan kedua, yang mengubah parsedValue
secara langsung. Perhatikan bahwa masukan teratas tidak memperbarui). Ini mungkin terjadi dari tindakan pengontrol atau dari memuat data dari layanan data.
Apakah ada cara yang lebih mudah untuk mengimplementasikan skenario ini menggunakan AngularJS? Apakah saya kehilangan beberapa fungsionalitas dalam dokumentasi?
sumber
ngModelCtrl
$scope
secara langsung, model akan disetel ke ... hingga pengguna berinteraksi dengan kotak teks. Pada saat itu, pengurai apa pun kemudian dapat memengaruhi nilai model. Selain parser, Anda dapat menambahkan $ watch ke pengontrol Anda untuk mengubah nilai model.