J'ai une directive d'attribut AngularJS et je voudrais entreprendre une action à chaque fois que la valeur de l'entrée parent change. En ce moment je le fais avec jQuery:
angular.module("myDirective", [])
.directive("myDirective", function()
{
return {
restrict: "A",
scope:
{
myDirective: "=myDirective"
},
link: function(scope, element, attrs)
{
element.keypress(function()
{
// do stuff
});
}
};
});
Est-il possible de faire cela sans jQuery? Je trouve que l'événement keyPress ne fait pas exactement ce que je veux, et bien que je sois sûr de trouver une solution, je suis un peu inquiet lorsque je recourt à jQuery dans un Angular projet.
Alors, quel est le moyen Angular) de le faire?
Il y a un excellent exemple dans Docs AngularJS .
C'est très bien commenté et devrait vous faire pointer dans la bonne direction.
Voici un exemple simple, peut-être davantage, que vous recherchez:
[~ # ~] html [~ # ~]
<div ng-app="myDirective" ng-controller="x">
<input type="text" ng-model="test" my-directive>
</div>
JavaScript
angular.module('myDirective', [])
.directive('myDirective', function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.$watch(attrs.ngModel, function (v) {
console.log('value changed, new value is: ' + v);
});
}
};
});
function x($scope) {
$scope.test = 'value here';
}
Edit: Même chose, ne nécessite pas ngModel
jsfiddle :
JavaScript
angular.module('myDirective', [])
.directive('myDirective', function () {
return {
restrict: 'A',
scope: {
myDirective: '='
},
link: function (scope, element, attrs) {
// set the initial value of the textbox
element.val(scope.myDirective);
element.data('old-value', scope.myDirective);
// detect outside changes and update our input
scope.$watch('myDirective', function (val) {
element.val(scope.myDirective);
});
// on blur, update the value in scope
element.bind('propertychange keyup paste', function (blurEvent) {
if (element.data('old-value') != element.val()) {
console.log('value changed, new value is: ' + element.val());
scope.$apply(function () {
scope.myDirective = element.val();
element.data('old-value', element.val());
});
}
});
}
};
});
function x($scope) {
$scope.test = 'value here';
}
Puisque cela doit avoir un élément d’entrée en tant que parent, vous pouvez simplement utiliser
<input type="text" ng-model="foo" ng-change="myOnChangeFunction()">
Vous pouvez aussi utiliser le ngModelController
et ajouter une fonction à $formatters
, qui exécute les fonctions lors du changement d’entrée. Voir http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController
.directive("myDirective", function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ngModel) {
ngModel.$formatters.Push(function(value) {
// Do stuff here, and return the formatted value.
});
};
};
Pour surveiller les modifications de la durée d'exécution d'une directive personnalisée, utilisez $observe
méthode de attrs
objet, au lieu de mettre $watch
dans une directive personnalisée. Voici la documentation pour le même ... $ observer docs