2015-12-16 16 views
11

Tôi không làm gì quá đặc biệt.

Tôi có đầu vào tôi muốn được xác thực với mọi đột quỵ chính. Nếu xác nhận không thành công, hiển thị lỗi. Đừng chờ đợi sự kiện làm mờ để kích hoạt $ chạm.

Tôi nghĩ đây là trường hợp mặc định, nhưng dường như không phải như vậy. Tôi đang sử dụng vật liệu góc cạnh cùng với thông điệp góc. Tôi đang làm điều này cho phát hiện capslock.

Các đánh dấu:

<form name="primaryLogin" novalidate> 
    <md-content layout-padding layout="column"> 
     <md-input-container flex> 
      <label>Login ID</label> 
      <input type="text" required="" name="login" ng-model="primary.loginID" capslock> 

      <div ng-messages="primaryLogin.$error"> 
       <div ng-message="required"> 
        Please enter a Login ID. 
       </div> 

       <div ng-message="capslock"> 
        Caps Lock is ON! 
       </div> 
      </div> 

      <pre>{{ primaryLogin | json }}</pre> 

     </md-input-container> 

    </md-content> 
</form> 

Khi tôi lần đầu tiên đến với trang, bật Caps lock, và bắt đầu nhập, thông báo lỗi của tôi trông giống như vậy:

{ 
    "$error": { 
    "capslock": [ 
     { 
     "$viewValue": "Q", 
     "$validators": {}, 
     "$asyncValidators": {}, 
     "$parsers": [ 
      null 
     ], 
     "$formatters": [ 
      null, 
      null 
     ], 
     "$viewChangeListeners": [], 
     "$untouched": false, 
     "$touched": true, 
     "$pristine": false, 
     "$dirty": true, 
     "$valid": false, 
     "$invalid": true, 
     "$error": { 
      "capslock": true 
     }, 
     "$name": "login", 
     "$options": { 
      "debounce": 100, 
      "updateOnDefault": true 
     } 
     } 
    ] 
    }, 
    "$name": "primaryLogin", 
    "$dirty": true, 
    "$pristine": false, 
    "$valid": false, 
    "$invalid": true, 
    "$submitted": false, 
    "login": { 
    "$viewValue": "Q", 
    "$validators": {}, 
    "$asyncValidators": {}, 
    "$parsers": [ 
     null 
    ], 
    "$formatters": [ 
     null, 
     null 
    ], 
    "$viewChangeListeners": [], 
    "$untouched": true, 
    "$touched": false, 
    "$pristine": false, 
    "$dirty": true, 
    "$valid": false, 
    "$invalid": true, 
    "$error": { 
     "capslock": true 
    }, 
    "$name": "login", 
    "$options": { 
     "debounce": 100, 
     "updateOnDefault": true 
    } 
    } 
} 

Vì vậy, đây có vẻ là làm việc như mong đợi, nhưng thông báo lỗi thực sự không hiển thị cho đến khi sự kiện mờ phát ra trên đầu vào cụ thể đó. Vì vậy, tôi có thể vào bằng capslock, nhập 10 ký tự, đối tượng lỗi nói lỗi capslock ở đó, nhưng vì $ chạm không đúng, sau đó nó không hiển thị.

Khi $ chạm được đặt thành true, sau đó tôi có thể quay lại đầu vào và mọi thứ hoạt động như mong đợi.

Bất kỳ ý tưởng nào? Cảm ơn trước!

+0

Thuộc tính 'capslock' là gì? – tasseKATT

+0

@tasseKATT Thuộc tính capslock là chỉ thị tùy chỉnh cho phát hiện capslock. Nó có trạng thái lỗi riêng để hiển thị tin nhắn. – TyMayn

+0

Lưu ý: thông thường khi bạn muốn buộc mọi người sử dụng chữ thường, bạn chỉ cần ép chữ thường thay vì xác thực xem http://stackoverflow.com/questions/16388562/angularjs-force-uppercase-in-textbox – Walfrat

Trả lời

16

Thay đổi

<div ng-messages="primaryLogin.$error"> 

để

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty"> 

Bạn cũng có thể thử

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$touched"> 

HOẶC

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$pristine"> 

Bạn cũng có thể câu lạc bộ chúng như vậy cho có điều kiện và kiểm tra:

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty && primaryLogin.login.$touched && primaryLogin.login.$pristine"> 

hoặc có điều kiện OR kiểm tra:

<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty || primaryLogin.login.$touched || primaryLogin.login.$pristine"> 

Thử một ở trên người một để tìm hiểu bất cứ một đáp ứng trường hợp của bạn.

+0

Cảm ơn bạn. Thêm 'ng-show =" primaryLogin.login. $ Dirty "' đã thực hiện thủ thuật. Tôi mặc dù tin nhắn ng xử lý nó ng-show của riêng mình. Bạn có thể đưa ra một số giải thích về lý do tại sao hoạt động đó không? – TyMayn

+1

@TyMayn ng-tin nhắn bắt đầu hiển thị thông báo lỗi ngay sau khi tải trang. Nhưng bạn có thể không muốn nó. Bạn có thể muốn kiểm soát thời điểm hiển thị các thông báo lỗi đó. $ dirty nghĩa là người dùng đã tương tác với phần tử. Vì vậy, đối với văn bản kiểu đầu vào, điều đó có nghĩa là người dùng đã nhập một số văn bản (ngay cả một ký tự đơn lẻ cũng bị bắt). Điều này là không mờ, vì vậy người dùng vẫn có thể có con trỏ của mình trong hộp văn bản và tiếp tục nhập một cái gì đó và tất cả những gì sẽ bị bắt bởi $ bẩn. $ chạm là nơi người dùng nhấp vào một điều khiển nhưng đã chuyển đi mà không giải phóng nó. $ nguyên sơ là nơi người dùng không nhấp/làm mờ điều khiển. – Devner

2

Trong phiên bản Pre 1.0 của Tài liệu góc (tức là < = v0.11.4), đó là trường hợp: Thông báo ng được hiển thị theo mặc định.

Tuy nhiên, material design spec trạng thái:

Hiển thị lỗi văn bản chỉ sau khi người dùng tương tác với một lĩnh vực. Nếu người dùng nhập dữ liệu không chính xác, văn bản trợ giúp có thể chuyển thành văn bản lỗi.

Nếu bạn muốn hiển thị thư trước tương tác của người dùng, bạn có thể thêm "md-auto-hide = 'false'" vào chỉ thị ng-tin nhắn của mình.

<div ng-messages="primaryLogin.$error" md-auto-hide='false'></div> 

tôi tìm thấy giải pháp này từ: here

+0

nó sẽ là tuyệt vời nhưng nó không giúp đỡ. Kiểm tra này: http://codepen.io/anon/pen/RGRgoN. Ngay cả khi bạn thêm md-tự động ẩn thì tin nhắn cho email sẽ không được hiển thị khi tải trang. –

+0

Rất tốt, cảm ơn :) – Leasye

1

Kiểm tra với ng-show="primaryLogin.login.$invalid && primaryLogin.login.$touched". Điều này đã làm cho các trick cho tôi.

1

Sử dụng md-là-lỗi exampl:

<md-input-container md-is-error="true"> 

"Khi biểu thức đã cho để đánh giá đúng, container đầu vào sẽ đi vào trạng thái lỗi Defaults để erroring nếu đầu vào đã được xúc động và không hợp lệ. . "

https://material.angularjs.org/1.1.3/api/directive/mdInputContainer

+0

Điều này là tốt nhất như ng-show hoặc ng-nếu messes up với hình ảnh động ng-tin nhắn. Thay vì chỉ đúng cho thông điệp md-is-error nếu chúng ta đặt điều kiện trong md-is-error, nó hoạt động như một sự quyến rũ. Cảm ơn. –

Các vấn đề liên quan