2013-01-17 28 views
6

希望其他人也觀察到了這一點: -AngularJS數據綁定鉻日期時間控制的工作不更新後24.0.1312.52

我們使用AngularJS 1.0和使用類型=「日期」與元素讓Chrome的默認不錯選擇器日期時間。 一切都很好,直到鉻最近更新爲[24.0.1312.52]。現在,如果我使用datetime選擇器更改日期,AngularJS數據綁定不會保存它以綁定$ scope的json屬性。

如果我通過任何鍵盤按鍵更改日期,數據綁定將日期保存到屬性綁定。

可能是導致此問題的原因。

回答

2

我們angularJS谷歌羣體得到幫助: -

https://groups.google.com/forum/?fromgroups=#!topic/angular/ycYzD3xRKS8

JSFeedle由彼得·培根達爾文

http://jsfiddle.net/ZsRxj/

var module = angular.module('demoApp',[]); 

module.directive('input', function() { 
    return { 
    require: '?ngModel', 
    restrict: 'E', 
    link: function (scope, element, attrs, ngModel) { 
     if (attrs.type="date" && ngModel) { 
     element.bind('change', function() { 
      scope.$apply(function() { 
      ngModel.$setViewValue(element.val()); 
      }); 
     }); 
     } 
    } 
    }; 
}); 
0

當您通過選取器選擇日期時,Chrome似乎不會觸發input。短期入侵是change事件(其中Chrome 發生火災)至input;幸好AngularJS不使用事件本身在聽者,所以你不必擔心映射事件值或任何東西:

$('body').on('change', 'input[type="date"]', null, function(){ 
    $(this).trigger('input'); 
}); 

一個更好的解決辦法是找出爲什麼瀏覽器不點火input 。警告:儘管AngularJS代碼中似乎沒有任何地方會導致change觸發(從而啓動無限循環),粗略測試意味着上述工作,但「更好的解決方案」將是更好的解決方案。

4

我已經注意到了相同的行爲,並注意到Sutikshan走在正確的道路上。

HTML 5 input date要求值爲RF 3339格式,因此,我們可以調整我們的AngularJS input directive以相應地格式化和解析值。

angular.module('myApp', []).directive('input', ['$filter', 
function($filter) { 
    return { 
     require: '?ngModel', 
     restrict: 'E', 
     link: function(scope, element, attrs, ngModel) { 
      if (!ngModel || attrs.type != "date") return; 

      // Using AngularJS built in date filter, convert our date to RFC 3339 
      ngModel.$formatters = [function(value) { 
       return value && angular.isDate(value) 
        ? $filter('date')(value, 'yyyy-MM-dd') 
        : ''; 
      }]; 

      // Convert the string value to Date object. 
      ngModel.$parsers = [function(value) { 
       return value && angular.isString(value) 
        ? new Date(value) 
        : null; 
      }]; 
     } 
    }; 
}]); 

的基礎是,我們保證NgModelController使用我們$格式化和$解析器分別更新視圖值和模型值時,。