2014-02-14 65 views
2

我創造了這個指令:爲什麼手動將控件設置爲Angular的原始形式時,表單會被標記爲髒?

app.directive("date", ['$filter', function ($filter) { 
    return { 
     restrict: 'A', 
     require: '?ngModel', 
     link: function (scope, element, attributes, controller) {   
      scope.$watch(function() { 
       return controller.$modelValue; 
      }, 
      function (newVal, oldVal) { 
       if (newVal !== oldVal && newVal) { 
        var format = attributes.date || "dd-MM-yyyy"; 
        var parsedDate = new Date(newVal); 

        parsedDate = $filter('date')(newVal, format); 

        controller.$setViewValue(parsedDate); 
        controller.$setPristine(); 
        controller.$render(); 
       } 
      }); 
     } 
    } 
}]) 

我這個指令是這樣的:

<form name='myForm'> 
    Date: <input type="text" data-ng-model="contract.StartDate" name="StartDate" date /> 
</form> 

在我的範圍,我沒有這決定了保存按鈕的狀態的功能:

scope.canSave = function() { 
    return scope.contractForm.$valid && scope.contractForm.$dirty; 
} 

正如您在date指令的代碼片段中看到的那樣,我設置了controller.$setPristine(),但是此操作沒有通過表單控件oller,因爲form.$dirty設置爲true,但是當我檢查form.StartDate.$dirty時,它設置爲false

這怎麼可能,我怎麼能確保/強制form看到StartDate不是髒?

回答

0

我終於找到解析器和格式化的形式的解決方案:

app.directive("date", ['$filter', function ($filter) { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function (scope, element, attributes, controller) { 
      controller.$parsers.unshift(function (value) { 
       if (!value) { 
        return; 
       } 

       var format = attributes.date || "dd-MM-yyyy"; 
       return $filter('date')(value, format); 
      }) 

      controller.$formatters.unshift(function (value) { 
       if (!value) return; 

       var format = attributes.date || "dd-MM-yyyy"; 
       return $filter('date')(value, format); 
      }) 
     } 
    } 
}]) 
+0

你的答案提供瞭解決方法;它並不回答你的問題。我將這稱爲Angular中的一個錯誤(與1.4.8相同的問題)。下面是一個簡單的演示問題的普朗克:https://plnkr.co/edit/6noEtj6vbMkqxiKK6Yp7?p=preview – Eccentropy

相關問題