ngModel неправильно обновляется в Internet Explorer - AngularJS 1.3

Здравствуйте, у меня странная проблема, которая появляется только в IE 11 с angular 1.3.

У меня есть директива, которая позволяет мне хранить 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, и фаерфокс),

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();
            });
        }
    }
});

person akn    schedule 17.04.2015    source источник
comment
Какая версия ИЕ?   -  person BobDoleForPresident    schedule 17.04.2015
comment
@BobDoleForPresident IE 11   -  person akn    schedule 17.04.2015
comment
jsfiddle.net/mvx9dbyu/5 — я не уверен, что scope.$apply не работает или нет, потому что Я не могу открыть консоль разработчика на своем ie 11.   -  person YOU    schedule 19.04.2015
comment
@YOU, спасибо, все работает нормально - в консоли нет ошибок дайджеста.   -  person akn    schedule 19.04.2015


Ответы (1)


В Angular 1.3 есть какой-то хак для события input для браузеров IE. Пожалуйста, проанализируйте $SnifferProvider.hasEvent функцию. Эта функция используется в inputDirective, чтобы гарантировать правильное значение viewValue для браузеров, которые не поддерживают событие input. Обходной путь основан на событии keydown, которое широко поддерживается.

Чтобы исправить пример кода для IE, просто включите событие keydown, чтобы отключить все триггеры.

link: function(scope, elem, attrs, ngModel){
        elem.off('input');
        elem.off('change');
        elem.off('keydown');
        ...
person Tomasz Białecki    schedule 19.04.2015
comment
Спасибо, что указали на корень проблемы!! Для тех, кто находится в похожей ситуации: в моем случае установка модели на обновление при нажатии клавиши вместо значения по умолчанию (ng-model-options="{ updateOn: 'keydown' }" для элемента) дало мне желаемое поведение. У меня были другие директивы для элемента ввода, поэтому YMMV. - person melanie johnson; 06.07.2016