2013-07-12 55 views
7

我有2個文本框,一個是必需的,另一個是不需要的。需要文本框的角度奇怪的行爲

如果我們增加在所需的文本框中的文字,說「ABC」,然後刪除該內容,對ng-model設置爲undefined

如果我們添加文本到非必填字段,並刪除內容時,ng-model是不是空字符串""

這是關於我在上面解釋過的行爲的一個騙局。請使用控制檯查看結果。

http://plnkr.co/edit/XgQBfcyRF3OwG1qC0gXb?p=preview

爲什麼會出現在設置兩者之間的ng-model有區別嗎?

+0

我試過用v1.0.1,v1.0.7和v1.1.5。它們都具有相同的行爲 – Abilash

+3

默認情況下,空輸入的值是一個空字符串。通過源代碼查看,required屬性會掛鉤到angular的驗證中,這可能會返回未定義的模型的新的無效屬性。好問題。我希望你能得到真正的答案! – rGil

+0

是的,看起來這是設計。 – Diryboy

回答

2

在設計上似乎是,並且與經過驗證的表單值的一致行爲有關。

沒有這種行爲在任何文檔,據我所知..它在這裏暗示 - >https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L1045

隨着angularJS驗證,如果字段中輸入的值是允許的,是成爲模特的價值(因爲任何其他的界限值都會表現出來)。如果不是,則唯一一致的方法是將該值設置爲未定義(因爲在該字段中不允許值)。其他兩個選項將保持它的最後一個有效值,或者保持綁定錯誤的值,只觸發無效字段和表單的標誌。這兩種解決方案都很糟糕 - 留下最後一個值可能是不需要的(如果你使用值而不考慮表單的狀態,這會導致錯誤)並且允許無效的值是一個可怕的罪行;)(你不能這樣做) t相信驗證服務,以幫助防止錯誤類型的錯誤使用)

雖然它可能看起來很奇怪,甚至不一致,但它確實不是。我稍微修改了你的plunkr來驗證一個數字,我相信它更清楚爲什麼它是這樣的:http://plnkr.co/edit/9gJmblUn9MUUeFt5lWJZ?p=preview

所以,實際上沒有區別 - 只有在你的第二個輸入中,一個空字符串被認爲是一個有效的,因此被接受的值。