我可以自己设置像$ invalid这样的属性吗?

时间:2014-05-26 06:56:10

标签: angularjs angularjs-directive

我想在输入元素上设置一个属性(在这种情况下模糊),就像AngularJs在元素上设置$ invalid,$ valid等一样。

这是否可以来自指令,如果是,如何?

1 个答案:

答案 0 :(得分:0)

元素控制器上的角度集属性,而不是元素本身。

控件(例如inputselect等)有 NgModelController ,而forms / ngForms有的 FormController

NgModelController负责通知家长FormController(如果有)有关$invalid等属性的更改。
使用NgModelController(例如inputselect等)的指令负责确定值何时有效,并调用其NgModelController的适当方法。


对于像在控制器上设置属性这样简单的事情,您需要一个可以访问控制器实例的指令(通过require - 并且你很好):

.directive('blurMonitor', function () {
    return {
        restrict: 'A',
        require:  'ngModel',   // to get access to the controller
        link: function postLink(scope, elem, attrs, ctrl) {   // ctrl===NgModelController
            /* Initialize the property */
            ctrl.$blurred = true;

            /* Update the property value on focus */
            elem.on('focus', function () {
                /* Since JS events fire asynchronously and outside 
                 * of the "Angular context" we need to call `$apply()` */
                scope.$apply(function () {
                    ctrl.$blurred = false;
                });
            });

            /* Update the property value on blur */
            elem.on('blur', function () {
                /* Since JS events fire asynchronously and outside 
                 * of the "Angular context" we need to call `$apply()` */
                scope.$apply(function () {
                    ctrl.$blurred = true;
                });
            });
        }
    };
});

<form name="form1">
    <input type="text" name="text1" ng-model="something" blur-monitor />
    <p>Blurred: {{form1.text1.$blurred}}</p>
</form>

另请参阅此 short demo