您好,我有一个奇怪的问题,该问题仅出现在 Angular 1.3 的 IE 11 中。

我有一个指令,它允许我将 Object 存储为 ngModel 元素的 input 值。它适用于 AngularJS 1.2,没有任何问题,但不适用于 AngularJS 1.3(仅在 Internet Explorer 中)。

它是简单的代码:

elem.on('input', function(){
   var val = elem.val();
    ngModel.$setViewValue({
        'sampleData': new Date().getTime(),
        'value': val
    });
    scope.$apply();
});

当我在 IE 中输入文本时,输入将正确的对象设置为模型值几毫秒,但接下来将其更改为字符串。在其他浏览器中,它会正确更新 ngModel

你可以在那里看到这种奇怪的行为:

AngularJS 1.2:http://jsfiddle.net/aartek/e6Lvpqj3/(适用于 IE、Chrome 和 Firefox),

AngularJS 1.3:http://jsfiddle.net/aartek/mvx9dbyu/2/( 在 IE 11 中无效,在 Chrome 和 Firefox 中有效)

是什么原因,我该如何解决?

这是我的全部指令:
app.directive('myInput',function(){
    return{
        restrict: 'A',
        require: 'ngModel',
        scope: {},
        priority: 1,
        link: function(scope, elem, attrs, ngModel){
            elem.off('input');
            elem.off('change');

            ngModel.$render = function(){
                var model = {
                    'sampleData': 'sampleData',
                    value: ''
                }
                ngModel.$setViewValue(model);
                elem.val(model.value);
            }

            elem.on('input', function(){
               var val = elem.val();
                ngModel.$setViewValue({
                    'sampleData': new Date().getTime(),
                    value: val
                });
                scope.$apply();
            });
        }
    }
});

最佳答案

Angular 1.3 对 IE 浏览器的 input 事件进行了某种修改。请分析 $SnifferProvider.hasEvent 函数。该函数在 inputDirective 中使用,以保证不支持 input 事件的浏览器的正确 viewValue。解决方法基于广泛支持的 keydown 事件。

要修复 IE 的代码示例,请简单地打开 keydown 事件以禁用所有触发器。

link: function(scope, elem, attrs, ngModel){
        elem.off('input');
        elem.off('change');
        elem.off('keydown');
        ...

关于javascript - ngModel 未在 Internet Explorer 中正确更新 - AngularJS 1.3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29698836/

10-16 19:56