web-dev-qa-db-ja.com

AngularJS-属性ディレクティブの入力値の変更

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方法は何でしょうか?

39
Mike Pateras

AngularJS docs には素晴らしい例があります。

非常によくコメントされており、正しい方向に向けられるはずです。

簡単な例、おそらくもっと多くの場合、あなたが探しているものは以下です:

jsfiddle


[〜#〜] 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';
}


編集:同じこと、ngModeljsfiddle を必要としません:

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';
}
63
Langdon

これには、親として入力要素が必要であるため、単に使用できます

<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.
      });
  };
};
12
Jmr

カスタムディレクティブの値のランタイムの変化を監視するには、カスタムディレクティブ内に$observeを配置する代わりに、attrsオブジェクトの$watchメソッドを使用します。以下は同じもののドキュメントです... $ observe docs

0
Shivam