AngularJS - 属性指令输入值更改

时间:2013-04-30 20:20:34

标签: jquery angularjs attributes directive

我有一个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项目中使用jQuery时,我会有点紧张。 / p>

那么Angular的做法是什么?

3 个答案:

答案 0 :(得分:63)

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


修改:同样的事情,不需要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';
}

答案 1 :(得分:12)

由于必须将input元素作为父元素,因此您只需使用

即可
<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.
      });
  };
};

答案 2 :(得分:0)

要注意自定义指令值的运行时更改,请使用$observe对象的attrs方法,而不是将$watch放在自定义指令中。 以下是相同的文档...... $observe docs