AngularJS <input> validasi tanpa menyertakan <form>


99

Apakah mungkin di Angular untuk memvalidasi satu, terisolasi <input>dengan cara yang sama formulir divalidasi? Saya sedang memikirkan sesuatu seperti ini:

<div class="form-group">
    <input name="myInput" type="text" class="form-control" ng-model="bindTo" ng-maxlength="5">
    <span class="error" ng-show="myInput.$error.maxlength">Too long!</span>
</div>

Contoh di atas tidak berhasil. Melampirkannya di a <form>dan menggantinya ng-showdengan ng-show="myForm.myInput.$error.maxlength"bantuan.

Apakah mungkin melakukan ini tanpa menggunakan <form>?


2
Apakah kamu sudah mencobanya Saya tidak berpikir demikian, saya percaya Angular membuat di form.FormControllerbelakang layar yang melacak status input formulir, hal-hal seperti valid\invalid & dirty\pristine. docs.angularjs.org/api/ng/type/form.FormController
meconroy

Jawaban:


184

Anda dapat menggunakan arahan angular ng-form ( lihat dokumen di sini ) untuk mengelompokkan apa saja, bahkan di luar bentuk html. Kemudian, Anda dapat memanfaatkan FormController sudut.

<div class="form-group" ng-form name="myForm">
    <input name="myInput" type="text" class="form-control" ng-model="bindTo" ng-maxlength="5">
    <span class="error" ng-show="myForm.myInput.$error.maxlength">Too long!</span>
</div>

Contoh


Menerima jawaban ini. Itulah yang saya cari-cari, meskipun jawabannya agak terlambat :)
Wojtek

1
Ini membantu saya juga. Saya menarik rambut saya dan tersandung ini. Terima kasih!
Alex McCabe

1
Untuk pembaca mendatang yang juga ingin memvalidasi formulir seperti itu pada acara ng-click dari sebuah tombol, lihat di sini: stackoverflow.com/a/24123379/1371408
Matty J

Beberapa masukan dengan contoh validasi individual plnkr.co/edit/wuOExkq4LXEiDELm2C6E?p=preview
Nathan Redblur

@SilvioLucas - contoh Anda masih "Menjalankan" meskipun bidangnya kosong ...?
colmde

0

Berdasarkan jawaban Silvio Lucas, jika Anda mengulang dalam satu lingkaran dan harus dapat menginterpolasi nama formulir dan status valid:

<div
  name="{{propertyName}}"
  ng-form=""
  class="property-edit-view"
  ng-class="{
    'has-error': {{propertyName}}.editBox.$invalid,
    'has-success':
      {{propertyName}}.editBox.$valid &&
      {{propertyName}}.editBox.$dirty &&
      propertyValue.length !== 0
  }"
  ng-switch="schema.type">
  <input
    name="editBox"
    ng-switch-when="int"
    type="number"
    ng-model="propertyValue"
    ng-pattern="/^[0-9]+$/"
    class="form-control">
  <input
    name="editBox"
    ng-switch-default=""
    type="text"
    ng-model="propertyValue"
    class="form-control">
  <span class="property-type" ng-bind="schema.type"></span>
</div>

-4
<!DOCTYPE html>
<html ng-app="plunker">
<head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.5/angular.min.js">   </script>

</head>

<body ng-controller="MainCtrl">
    <div class="help-block error" ng-show="test.field.$error.required">Required</div>
    <div class="help-block error" ng-show="test.firstName.$error.required">Name Required</div>
    <p>Hello {{name}}!</p>
    <div ng-form="test" id="test">
        <input type="text" name="firstName" ng-model="firstName" required> First name <br/> 
        <input id="field" name="field" required ng-model="field2" type="text"/>
    </div>
</body>
<script>
    var app = angular.module('plunker', []);

    app.controller('MainCtrl', function($scope) {
      $scope.name = 'World';
      $scope.field = "name";
      $scope.firstName = "FirstName";
      $scope.execute = function() {
        alert('Executed!');
      }
    });

</script>


1
Apakah ini berbeda dari stackoverflow.com/a/25342654/2333214 ? Jika ya, dapatkah Anda menambahkan penjelasan tentang perbedaannya?
TJ

Dan penjelasannya?
Maximiliano Becerra
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.