指令无法从" attrs"

时间:2016-06-08 15:51:18

标签: javascript angularjs

我的指令中有这个链接功能:

link: function(scope, element, attrs, ngModel) {
    ngModel.$formatters.push(function(value) {
        return $filter('number')(value, 0);
    });

    element.bind('keyup', function($event) {
        var start = this.selectionStart;
        var end = this.selectionEnd;
        if ($event.keyCode < 36 || $event.keyCode > 40) {
            var valor = ngModel.$viewValue;
            valor = valor.replace(/\./g, '');
            valor = valor.replace(/[a-zA-Z]/g, '');

            console.log(attrs.paramX);

            element.val($filter('number')(valor, 0) || "");
            if ($event.keyCode !== 8 && valor.length % 3 == 1) {
                this.setSelectionRange(start + 1, end + 1);
            } else {
                this.setSelectionRange(start, end);
            }
        }
    });
}

我无法看到变量&#34; attrs&#34;请有人帮我解决这个错误。

错误是&#34;无法读取属性&#39; paramX&#39;未定义的(...)&#34;

1 个答案:

答案 0 :(得分:0)

你在该指令中有一个孤立的范围吗?如果您的答案是肯定的,则可以使用自己定义的参数。请查看:https://docs.angularjs.org/guide/directive,在第34节中;隔离指令的范围&#34;。

另一方面,如果您不能使用隔离范围从外部获取属性,则可以添加&#34; attrs&#34;进入范围,可从指令内的任何地方访问。它有点hacky解决方案,可能不太理想,但可能有效。你的代码就像那样:

link: function(scope, element, attrs, ngModel) {
    /*
     * INITIALIZATION
     */
    scope.attrs = attrs;

    ngModel.$formatters.push(function(value) {
        return $filter('number')(value, 0);
    });

    element.bind('keyup', function($event) {
        var start = this.selectionStart;
        var end = this.selectionEnd;
        if ($event.keyCode < 36 || $event.keyCode > 40) {
            var valor = ngModel.$viewValue;
            valor = valor.replace(/\./g, '');
            valor = valor.replace(/[a-zA-Z]/g, '');

            /*
             * SCOPE ATTRS
             */
            console.log(scope.attrs.paramX);

            element.val($filter('number')(valor, 0) || "");
            if ($event.keyCode !== 8 && valor.length % 3 == 1) {
                this.setSelectionRange(start + 1, end + 1);
            } else {
                this.setSelectionRange(start, end);
            }
        }
    });
}

这个糟糕的解决方案根本不提供绑定,因此第一个attrs值将保留在范围变量中。