You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS指令经Gulp压缩JS后抛出[$injector:unpr]未知提供者错误求助

解决Angular指令压缩后[$injector:unpr]依赖注入错误

你遇到的错误是Angular依赖注入在代码压缩后的典型问题:Gulp的压缩工具(比如UglifyJS)会把函数参数名(像$filter、$browser)压缩成短变量名(比如e),而Angular默认通过参数名称匹配依赖服务,压缩后参数名被修改,Angular找不到对应的服务提供者,就会抛出Unknown provider错误。

解决方法是使用数组式依赖注入语法,把需要注入的服务名称以字符串形式提前声明——压缩工具不会修改字符串内容,Angular就能正确识别依赖。

修改后的phoneInput指令

careApp.directive('phoneInput', ['$filter', '$browser', function ($filter, $browser) {
    return {
        require: 'ngModel',
        link: function ($scope, $element, $attrs, ngModelCtrl) {
            var listener = function () {
                var value = $element.val().replace(/[^0-9]/g, '');
                $element.val($filter('tel')(value, false));
            };

            // 文本框更新时触发
            ngModelCtrl.$parsers.push(function (viewValue) {
                return viewValue.replace(/[^0-9]/g, '').slice(0, 10);
            });

            // 作用域中模型直接更新时,同步视图
            ngModelCtrl.$render = function () {
                $element.val($filter('tel')(ngModelCtrl.$viewValue, false));
            };

            $element.bind('change', listener);

            $element.bind('keydown', function (event) {
                var key = event.keyCode;
                // 特殊按键(CTRL/SHIFT/ALT/方向键等)不处理,支持复制粘贴
                if (key == 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) {
                    return;
                }
                $browser.defer(listener); // 延迟执行确保变更被正确捕获
            });

            $element.bind('paste cut', function () {
                $browser.defer(listener);
            });
        }

    };
}]);

修改后的tel过滤器

虽然当前过滤器没有依赖其他服务,但为了统一规范(后续添加依赖时无需修改写法),建议也使用数组式语法:

careApp.filter('tel', [function () {
    return function (tel) {
        if (!tel) { return ''; }

        var value = tel.toString().trim().replace(/^\+/, '');

        if (value.match(/[^0-9]/)) {
            return tel;
        }

        var city, number;

        switch (value.length) {
            case 1:
            case 2:
            case 3:
                city = value;
                break;

            default:
                city = value.slice(0, 3);
                number = value.slice(3);
        }

        if (number) {
            if (number.length > 3) {
                number = number.slice(0, 3) + '-' + number.slice(3, 7);
            }
            return ("(" + city + ") " + number).trim();
        }
        else {
            return city;
        }

    };
}]);

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:20:36