角度解析器调用模糊

时间:2016-08-04 18:17:15

标签: angularjs

我有一种使用angular指令的输入掩码。我正在使用formattersblur事件来格式化模型值以进行显示,我正在使用parsersfocus事件来删除格式用户编辑文本框。

我在Internet Explorer中遇到奇怪的行为,如果您使用Tab键失去焦点,解析器事件会(错误地)触发,因此模型值的更新不正确。

这是一个有角度的错误吗?或者有什么我做错了吗?

这是一个小提琴:https://jsfiddle.net/capesean/htorwgs5/3/

请注意,在IE中,打开控制台窗口,您将看到登出的事件。

另外,在早期的Angular版本上测试它似乎工作正常: https://jsfiddle.net/htorwgs5/4/

指令代码是:

.directive("test", function () {
    return {
        restrict: "A",
        require: 'ngModel',
        link: function (scope, element, attr, ngModel) {

            // for DOM -> model validation
            ngModel.$parsers.unshift(function (value) {
                console.log("parser");
                ngModel.$setValidity('test', true);
                return +value;
            });

            ngModel.$formatters.unshift(function (value) {
                console.log("formatter");
                ngModel.$setValidity('test', true);
                return (value === undefined ? "" : value) + "!";
            });

            element.val(scope.minutes);

            element.bind("blur", function () {
                scope.$apply(function () {
                    console.log("blur");
                    element.val((scope.minutes === undefined ? "" : scope.minutes) + "@");
                });
            });

            element.bind("focus", function () {
                scope.$apply(function () {
                    console.log("focus");
                    element.val(scope.minutes);
                });
            });

        }
    };
})

1 个答案:

答案 0 :(得分:1)

这是已知的行为。我在这里发布了一个错误报告: https://github.com/angular/angular.js/issues/14987

解决方案是使用$ timeout来延迟元素值的设置,如错误报告的回复中所示。