2

你好我有一個奇怪的問題,只出現在角度爲1.3的IE 11中。ngModel在Internet Explorer中未正確更新 - AngularJS 1.3

我有一個指令,它允許我存儲Object作爲ngModelinput元素。它對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(); 
}); 

當I型在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(); 
      }); 
     } 
    } 
}); 
+0

哪個版本的IE? – BobDoleForPresident

+0

@BobDoleForPresident IE 11 – akn

+1

http://jsfiddle.net/mvx9dbyu/5/ - 我不確定範圍$ apply失敗或沒有,因爲我無法打開我的ie開發者控制檯11. – YOU

回答

6

角1.3具有某種黑客爲input事件IE瀏覽器。請分析$SnifferProvider.hasEvent函數。此函數在inputDirective中使用,以保證不支持input事件的瀏覽器的正確viewValue。解決方法基於廣泛支持的​​事件。

要修復你的IE代碼示例,簡單地打開​​事件來禁用所有觸發器。

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

謝謝你指出這個問題的根源!對於任何處於類似情況的人:在我的情況下,將模型設置爲在keydown上更新而不是默認(元素上的'ng-model-options =「{updateOn:'keydown'}」)給了我想要的行爲。我對輸入元素有其他指令,所以YMMV。 –