javascript - AngularJS指令如何在条件下显示/隐藏自定义(附加)元素

标签 javascript jquery angularjs angularjs-directive

我正在研究 Angular 指令,以在文本区域上超出字符数显示错误消息。

使用以下代码,我可以通过附加在元素上来显示错误(div)MSG,但在第一次显示后我无法隐藏它,我需要在 else block 中做什么来删除“elCharLimitError”。

angular.module('app', []).directive('wordCount', ['$compile', function($compile) {


    function wordCountLinkFunc(scope, ele, attr, ngModel) {

        var charLimit = attr.wordCount;
        console.log(charLimit);
        var elCharLimitError = angular.element('<div class="alert alert-danger">Cannot exceed Character limit<b>' + charLimit + '</b></div>');

        ele.bind('keyup', function(event) {

            if (ngModel.$viewValue && ngModel.$viewValue.length >= charLimit) {
                $compile(elCharLimitError)(scope);
                ele.append(elCharLimitError);
            } else {
                //TODO: need help to hide the error element "elCharLimitError"
            }
        });
        ele.bind('keypress', function(event) {

            if (ngModel.$viewValue && ngModel.$viewValue.length >= charLimit) {
                if (event.keyCode !== 8) {
                    event.preventDefault();
                }
            } else {
                //TODO: need help to hide the error msg "elCharLimitError"
            }
        });
    }

    return {
        restrict: 'A',
        require: 'ngModel',
        link: wordCountLinkFunc
    };
}]);

笨蛋链接:http://plnkr.co/edit/OjfsfFwkeiJKlnHZ9TOE

最佳答案

首先,您不想在textarea中追加新内容:它不应该包含HTML内容并且无法显示它。相反,请考虑在元素后面插入错误消息。

对于显示/隐藏功能,我会将其提取为两个单独的函数,并从事件处理程序内部使用它们。

指令看起来像这样:

angular.module('app', []).directive('wordCount', ['$compile', function($compile) {


    function wordCountLinkFunc(scope, ele, attr, ngModel) {

        var charLimit = attr.wordCount;
        var elCharLimitError = angular.element('<div class="alert alert-danger">Cannot exceed Character limit<b>' + charLimit + '</b></div>');

        function showError() {
            if (!elCharLimitError.hasClass('ng-scope')) {
                $compile(elCharLimitError)(scope);
                ele.after(elCharLimitError);
            }
            elCharLimitError.show();
        }

        function hideError() {
            elCharLimitError.hide();
        }

        ele.bind('keyup', function(event) {
            if (ngModel.$viewValue && ngModel.$viewValue.length >= charLimit) {
                showError();
            } else {
                hideError();
            }
        });

        ele.bind('keypress', function(event) {

            if (ngModel.$viewValue && ngModel.$viewValue.length >= charLimit) {
                if (event.keyCode !== 8) {
                    event.preventDefault();
                }
            } else {
                hideError();
            }
        });
    }

    return {
        restrict: 'A',
        require: 'ngModel',
        link: wordCountLinkFunc
    };
}]);

演示: http://plnkr.co/edit/DKrwtBlJ8ikoSKoDWRby?p=preview

关于javascript - AngularJS指令如何在条件下显示/隐藏自定义(附加)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925389/

相关文章:

javascript - 如何在 Chrome desktopCapture 中获取调整大小事件

javascript - Jquery keydown 不会丢失任何东西

jquery 缓动图像

javascript - 我应该使用什么进行 AngularJS E2E 测试? Protractor 或 Angular Scenario Runner 或 Karma

javascript - 使用带有 javascript 的 $watch 观察 window.innerWidth 以了解浏览器分辨率的变化

javascript - select().append() 和 select().data().enter().append() 的区别?

javascript - Electron 将创建者窗口 ID 传递给新的 BrowserWindow

php - 在 Android 模拟器或手机上运行时,Ajax 请求无法在 Eclipse 中工作

javascript - jquery圆 Angular

javascript - 如何对动态生成的表单字段实现表单验证