4

Я новичок в синтаксических анализаторах и форматировщиках. У меня есть директива, которая будет делать валидацию при изменении модели. Один из способов сделать это - это часы $ watch, но из того, что я понимаю, это не очень хороший способ, поскольку он позволяет обновлять модель.Функция Parser не вызвана для изменения входного текстового поля

Так что я смотрел на анализаторах и попробовал этот код

app.directive('myDirective', function($compile) { 


return { 
    restrict: 'E', 
    require: 'ngModel', 
    scope: { 

    }, 

    link: function($scope, elem, attr, ctrl) { 
     console.debug($scope); 
     ctrl.$formatters.push(function(value) { 
     console.log("hello1"); 
     return value; 
     }); 
     ctrl.$parsers.unshift(function(value) { 

     debugger; 
     console.log("hello"); 
     return value; 
     }); 
    } 
    }; 
}); 

Но функция анализатора никогда не вызываются. Форматирование вызывается один раз. Please see the plunkr. Может кто-нибудь сказать мне, что я делаю неправильно, почему функция парсера не получает вызов, когда я набираю текстовое поле?

+1

попробовал ctrl. $ Parsers.push, по-прежнему не работает – Abhik

ответ

1

Это последний ответ, но для справки: Я думаю, что вы, где отсутствует «клей», который назовет $parsers, в то время как изменения ui происходят. Это должно быть что-то вроде:

app.directive('myDirective', function($compile) { 

return { 
    restrict: 'E', 
    require: 'ngModel', 
    scope: { 

    }, 

    link: function($scope, elem, attr, ctrl) { 
     console.debug($scope); 
     ctrl.$formatters.push(function(value) { 
     console.log("hello1"); 
     return value; 
     }); 
     ctrl.$parsers.unshift(function(value) { 
     return value; 
     }); 
     scope.$watch('directive model here', function() { 
     ctrl.$setViewValue(<build model from view here>); 
     }); 
    } 
    }; 
}); 

Для полной справки смотрите this (удивительный) пост.

0

Функция link не вызывается, потому что связанный элемент DOM не изменяется, просто модель. Это работает:

HTML:

This scope value <input ng-model="name" my-directive> 

JS:

app.directive('myDirective', function($compile) { 
    return { 
     require: 'ngModel', 
     link: function($scope, elem, attr, ctrl) { 
      ctrl.$parsers.unshift(function(value) { 
       console.log("hello"); 
      }); 
     } 
    }; 
}); 

См here для более когда функция link называется.