Saya membuat arahan yang dirancang untuk dilampirkan ke elemen menggunakan arahan ngModel. Jika nilai model cocok dengan sesuatu, maka nilainya harus ditetapkan ke nilai sebelumnya. Dalam contoh saya, saya mencari "foo", dan mengaturnya kembali ke sebelumnya jika itu yang diketik.
Tes unit saya lulus dengan baik karena mereka hanya melihat nilai model. Namun dalam praktiknya DOM tidak diperbarui ketika "put back" terpicu. Tebakan terbaik kami di sini adalah pengaturan old == new mencegah terjadinya cek kotor. Saya menelusuri metode $setViewValue dan tampaknya melakukan apa yang seharusnya. Namun itu tidak akan memperbarui DOM (dan apa yang Anda lihat di browser) sampai saya secara eksplisit memanggil ngModel.$render() setelah menetapkan nilai baru. Ini berfungsi dengan baik, tapi saya hanya ingin melihat apakah ada cara yang lebih tepat untuk melakukan ini.
Kodenya ada di bawah, ini biola yang sama.
angular.module('myDirective', [])
.directive('myDirective', function () {
return {
restrict: 'A',
terminal: true,
require: "?ngModel",
link: function (scope, element, attrs, ngModel) {
scope.$watch(attrs.ngModel, function (newValue, oldValue) {
//ngModel.$setViewValue(newValue + "!");
if (newValue == "foo")
{
ngModel.$setViewValue(oldValue);
/*
I Need this render call in order to update the input box; is that OK?
My best guess is that setting new = old prevents a dirty check which would trigger $render()
*/
ngModel.$render();
}
});
}
};
});
function x($scope) {
$scope.test = 'value here';
}