2014-06-05 98 views
3

我有指令是這樣的:

.directive('noWhitespace', ['$parse', function($parse) { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function (scope, element, attrs, ngModel) { 
     /* 
     scope.$watch(attrs.ngModel, function(value) { 
      var getter = $parse(value); 
      update(getter(scope)); 
     }); 
     */ 
     function update(viewValue) { 
      console.log(JSON.stringify(viewValue)); 
      if (viewValue.match(/\s/)) { 
      ngModel.$setValidity('whitespace', false); 
      return undefined; 
      } else { 
      ngModel.$setValidity('whitespace', true); 
      return viewValue; 
      } 
     } 
     ngModel.$parsers.unshift(update); 
     } 
    }; 
    }]) 

,當我使用它是這樣的:

<form name="something" novalidate> 
    <input ng-model="myValue" no-whitespace/> 
    <div ng-show="something.myValue.$error.whitespace"> 
    Error 
    </div> 
</form> 

和I型的東西,那麼在末尾update處的幾個空格不會被調用,直到我在這些空格之後鍵入字符,然後出現錯誤,表明有空格。 (同樣的情況發生時,我把空間放在開始或只有空格)。爲什麼是這樣,以及如何解決它?正如你在評論中看到的,我嘗試使用$watch+$parse,但得到了錯誤Cannot read property 'match' of undefined

回答

8

在您的模板試試這個:

<form name="something" novalidate> 
    <input ng-model="myValue" no-whitespace ng-trim="false"/> 
    <div ng-show="something.myValue.$error.whitespace"> 
    Error 
    </div> 
</form> 

這應該解決的問題輸入空白時,ng-model不會更新。

編輯:DERP,屬性變爲在未在div輸入元件...

+1

爲什麼ng-trim對div而不是輸入? – jcubic

+0

編輯...對不起。 – Wawy

0

這是角度模型解析器的預期行爲,想法是如果輸入的文本不正確(最後有空格),則ngModel應返回undefined。當你考慮它時,如果根據你的驗證不正確,你爲什麼還要保存一個值爲ngModel

這是相關位:

if (viewValue.match(/\s/)) { 
    ngModel.$setValidity('whitespace', false); 
    return undefined; 
} 

要設置有效期爲false,並返回undefined

你可以保持,即使它的價值不是由剛剛返回viewValue始終驗證更新模型:

if (viewValue.match(/\s/)) 
    ngModel.$setValidity('whitespace', false); 
else 
    ngModel.$setValidity('whitespace', true); 

// Return viewvalue regardless of whether it validates or not 
return viewValue; 
+0

在我的代碼'的console.log(JSON.stringify(viewValue));'當我在鍵入空間不執行結束還是開始。我可以刪除我的代碼,$解析器仍然不會觸發。 – jcubic

+0

在這種情況下,我誤解了這個問題,但@Wavy的答案看起來應該這樣做,儘管我同意'ngTrim'應該在輸入上。請參閱文檔https://docs.angularjs.org/api/ng/input/input%5Btext%5D – Elise