2013-09-26 160 views
0

我有一個有兩個日期值的表單。我想驗證:日期一必須低於日期二。我想做一個指令來管理這個。所以,我將我的指令命名爲lowerThanDateDate,並將其用於文本輸入。此指令使用兩個日期屬性:日期比較日期。我想比較這些值以知道日期是否低於比較日期。

我使用範圍$ eval來獲取這些日期值並進行比較。但是,問題在於範圍。$ eval正在返回以前的值而不是實際值。

所以,問題是:我怎樣才能得到實際的日期值?

這是我的問題plunker。對不起,如果我的問題是愚蠢的,我是非常新的Angular。提前感謝你。

回答

2

angularjs input directive通過ng-model屬性自動更新綁定到輸入的屬性數據。隨着文本框中的值發生更改,綁定屬性也會更改。

此外,ui-bootstrap庫中的datepicker-popup指令已經處理日期選擇事件以更新數據綁定屬性(在本例中爲job.start_date)。這意味着您不必綁定到元素的事件focusout; datepicker指令正在照顧這一點。

既然你需要ngModel控制器在自定義指令和datepicker-popup已經將更新應用到數據綁定屬性時所選擇的日期改變,你可以$watchngModel.$modelValue更改值。這也意味着Date屬性可以完全消除。

有了這一切記住,你的指令的link功能的身體變成:

scope.$watch(function(){return ngModel.$modelValue}, function(){ 
    console.log(ngModel.$modelValue); 
    console.log(scope.$eval(attrs.comparsionDate)); 
}); 

這裏的updated plunker

我還走了一步,完全實現了利用angularjs form validation功能的lowerThanDate功能。當所選日期不低於比較日期時,ngModel$error屬性可以由指令設置,並在HTML中用於顯示消息/保持表單不被提交。

這裏的the plunker,這裏是a blog post關於表單驗證,我覺得有用。

0

以下應該做的伎倆。你想要做的是使用ng-model屬性將日期輸入綁定到值。你的指令(我的例子中的驗證器)將有一個隔離範圍。日期:'='在本地值(日期)和父範圍值(dateInput)之間設置雙向綁定。在鏈接函數中,您可以將dateValidation賦值給指令的作用域,該作用域將進行日期之間的比較。

最後,根據dateValidation函數是否通過,ng-show ='dateValidation(date,comparativeDate)'顯示並隱藏警告。

另請注意,compareDate在HTML中拼寫不同。

angular.module('YourApp') 
    .directive('validator', function() { 
     return { 
      restrict: 'E', 
      template: "<div ng-show='dateValidation(date, comparisonDate)'>Dates are out of order</div>", 
      scope: { 
       date:'=', 
       comparisonDate:'=' 
      }, 
      link: function(scope) { 
       scope.dateValidation = function(date, comparisonDate) { 
        // Your date comparison logic goes here 
        return parseInt(date) > parseInt(comparisonDate); 
       }; 
      } 
     } 
    }); 

在HTML,要附加的日期到NG-模型屬性,如下所示:

<p>Date 1: <input type="text" ng-model="dateInput"></p> 
<p>Date 2: <input type="text" ng-model="comparisonDateInput"></p> 

<validator date="dateInput" comparison-date="comparisonDateInput"> 

好了,所以我在處理這些日期爲整數,這是不準確你想要什麼。但是,聽起來並不像這是你的關鍵。希望這可以幫助!