AngularJS属性ディレクティブがあり、その親入力の値が変更されるたびにアクションを実行したいと思います。今、私はjQueryでそれをやっています:
angular.module("myDirective", [])
.directive("myDirective", function()
{
return {
restrict: "A",
scope:
{
myDirective: "=myDirective"
},
link: function(scope, element, attrs)
{
element.keypress(function()
{
// do stuff
});
}
};
});
JQueryなしでこれを行う方法はありますか? keyPressイベントが思ったとおりに動作していないことがわかりました。解決策を思い付くはずですが、Angularプロジェクト。
では、これを行うAngular方法は何でしょうか?
AngularJS docs には素晴らしい例があります。
非常によくコメントされており、正しい方向に向けられるはずです。
簡単な例、おそらくもっと多くの場合、あなたが探しているものは以下です:
[〜#〜] 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';
}
編集:同じこと、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';
}
これには、親として入力要素が必要であるため、単に使用できます
<input type="text" ng-model="foo" ng-change="myOnChangeFunction()">
または、ngModelController
を使用して、入力変更時に関数を実行する$formatters
に関数を追加できます。 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.
});
};
};
カスタムディレクティブの値のランタイムの変化を監視するには、カスタムディレクティブ内に$observe
を配置する代わりに、attrs
オブジェクトの$watch
メソッドを使用します。以下は同じもののドキュメントです... $ observe docs