2015-01-06 13 views
7

Ho un elemento di forma creato con AngularJS con un pulsante di invio al suo interno e vorrei mettere questo pulsante al di fuori di questo modulo. Come posso farlo con Angular e il mio modulo è ancora validato?Come convalidare un modulo quando il pulsante di invio è esterno a questo modulo, con angularJs?

es codice html principale:

<div class="sd-chk-steps" ng-show="!step_03" ng-hide="step_03"> 

<!-- Panel Address --> 
<div id="sd-p-chk-1" class="large-8 columns sd-p-chk"> 
    <div class="cover step_complete" ng-show="step_01" ng-hide="!step_01"> 
    </div> 
    <sd-panel-address > 
    <!-- first form --> 
    </sd-panel-address> 
</div> 
<!-- /. Panel Address --> 

<!-- Panel delivery --> 
<div id="sd-p-chk-2" class="large-8 columns sd-p-chk"> 
    <div class="cover" ng-show="!step_01" ng-hide="step_01"></div> 
    <sd-panel-delivery> 
    <!-- second form --> 
    </sd-panel-delivery> 
    <div class="cover step_complete" ng-show="step_02" ng-hide="!step_02"></div> 
</div> 
<!-- /. Panel delivery --> 

<!-- Panel payment --> 
<div id="sd-p-chk-3" class="large-8 columns sd-p-chk"> 
    <div class="cover" ng-show="!step_02" ng-hide="step_02"></div> 
    <sd-panel-payment> 
    <!-- third form --> 
    </sd-panel-payment> 
</div> 
<!-- /. Panel payment --> 

<!-- group botton submit --> 
<div class="sd-chk-box"> 
    <div class="sd-chk-box-inner"> 

     <div class="large-8 columns sd-box-chk-btn sd-chk-btn-sm"> 
      <button ng-click="clickBtn(shipping.$valid)" type="submit" class="sd-chk-btn sd-button-cta" ng-disabled="shipping.$invalid"> 
      Next 
      </button> 
     </div> 

     <div class="large-8 columns sd-box-chk-btn sd-chk-btn-sm"> 
      <button class="sd-chk-btn sd-button-cta" ng-click="clickBtnStep02(formDelivery.$valid)" ng-disabled="formDelivery.$invalid"> 
      NEXT 
      </button> 
     </div> 

     <div class="large-8 columns sd-box-chk-btn sd-chk-btn-sm"> 
      <button class="sd-chk-btn sd-button-cta" ng-click="clickBtnStep03(payment.$valid)" ng-disabled="payment.$invalid"> 
      PLACE ORDER 
      </button> 
     </div> 

    </div> 
</div> 
<!-- /. group botton submit --> 

es codice html forma:

<form id="shipping" class="shipping" name="shipping" 
     novalidate 
     ng-submit="form.submit(shipping.$valid)" 
     ng-class="{'loading': form.submitting, 'is-el-dirty' : shipping.$dirty || shipping.dirty}"> 
     <fieldset> 
     <div class="row"> 
      <div class="large-12 columns"> 
      <label> 
       <input type="text" name="name" placeholder="Name" ng-model="form.data.name" required/> 
      </label> 
      <div class="error" ng-if="shipping.$submitted || shipping.name.$touched" ng-messages="shipping.name.$error"> 
       <p class="text-msg" ng-message="required">You did not enter your name</p> 
      </div> 
      </div> 
      <div class="large-12 columns"> 
      <label> 
       <input type="text" name="surname" placeholder="Surname" ng-model="form.data.surname" required/> 
      </label> 
      <div class="error" ng-if="shipping.$submitted || shipping.surname.$touched" ng-messages="shipping.surname.$error"> 
       <p class="text-msg" ng-message="required">You did not enter your Surname</p> 
      </div> 
      </div> 
     </div> 
     </fieldset> 
</form> 

es controllore codice:

(function() { 

    'use strict'; 

    /** 
    * @ngdoc function 
    * @name myApp.controller:globalCtrl 
    * @description 
    * # globalCtrl 
    * Controller of the myApp 
    */ 

    var myApp = angular.module('myApp'); 


    myApp.controller('globalCtrl', function($scope, $locale, $rootScope) { 

     // Check if checkbox it's checked 
     $scope.checked = true; 

     // got to step 2 
     $scope.clickBtn = function(form) { 
      //valid form 
      if (form === true) { 
       console.log('Form is valid, $rootScope.step_01= ' + $rootScope.step_01); 
       $rootScope.step_01 = true; 
       $rootScope.notValidStpe_01 = true; 
      } 

      //invalid form 
      if (form === false) { 
       $rootScope.step_01 = false; 
       $rootScope.notValidStpe_01 = false; 
       console.log('Form is invalid, $rootScope.step_01= ' + $rootScope.step_01); 
      } 
     }; 

     // got to step 3 
     $scope.clickBtnStep02 = function(form) { 
      //valid form 
      if (form === true) { 
       console.log('Form is valid, $rootScope.step_02 "'+ $rootScope.step_02); 
       $rootScope.step_02 = true; 
       $rootScope.notValidStpe_02 = true; 

      } 

      //invalid form 
      if (form === false) { 
       $rootScope.step_02 = false; 
       $rootScope.notValidStpe_02 = false; 
       console.log('Form is invalid, $rootScope.step_02= ' + $rootScope.step_02); 
      } 
     }; 


     // All steps completed 
     $scope.clickBtnStep03 = function(form) { 
      //valid form 
      if (form === true) { 
       console.log('Form is valid, $rootScope.step_03 "'+ $rootScope.step_03); 
       $rootScope.step_03 = true; 
       $rootScope.notValidStpe_03 = true; 

      } 

      //invalid form 
      if (form === false) { 
       $rootScope.step_03 = false; 
       $rootScope.notValidStpe_03 = false; 
       console.log('Form is invalid, $rootScope.step_03= ' + $rootScope.step_03); 
      } 
     }; 

    }); 

}(window, window.angular));enter code here 

codice es app.js

(function() { 

    'use strict'; 


    var myApp = angular 
     .module('myApp', [ 
      'ngResource', 
      'ngAnimate', 
      'ngMessages', 
      'templates' 
     ]); 


    myApp.run(function($rootScope) { 
     $rootScope.step_01 = false; 
     $rootScope.step_02 = false; 
     $rootScope.step_03 = false; 

     $rootScope.notValidStpe_01 = false; 
     $rootScope.notValidStpe_02 = false; 
     $rootScope.notValidStpe_03 = false; 
    }); 

}(window, window.angular)); 
+0

non è angolare costruito su jQuery in modo da poter semplicemente collegare un listener di eventi per inviare il modulo su un elemento che fa clic con .send()? così simile:

+0

Quello che voglio fare è mantenere disattivato il pulsante di invio se i campi del modulo non sono completati e quando si fa clic sul pulsante per abilitare il modulo seguente. Ma questo non mi funziona se ho i pulsanti fuori dal modulo – Fanatic

+0

Dovrebbe essere completamente possibile con le direttive ng date? o qualcosa di simile? –

risposta

3

Come ho capito Si tenta di fare forma wizzard. Tuttavia non hai bisogno di più elementi del modulo, usa solo un elemento del modulo in alto. Per i moduli figlio, utilizzare la direttiva ng-form per valutarli separatamente.

È possibile trovare la documentazione dettagliata https://docs.angularjs.org/api/ng/directive/ngForm sull'utilizzo ng-form

Qualcosa di simile

<form id="complateOrder" name="orderForm" ng-init="showShippingForm = true"> 

    <div ng-form="" name="shipping" ng-show="showShippingForm"> 
     shippig fields 
    <button type="button" ng-disabled="shipping.$invalid" ng-click="showDeliveryForm=true">Next</button> 
    </div> 
    <div ng-form="" name="delivery" ng-show="showDeliveryForm && shipping.$valid" ng-hide="shipping.$invalid" > 
     delivery fields 
     <button type="button" ng-disabled="shipping.$invalid && delivery.$invalid" ng-click="showPaymentForm=true">Next</button> 
    </div> 
    <div ng-form="" name="payment" ng-show="showPaymentForm && shipping.$valid && delivery.$valid " ng-hide="shipping.$invalid && delivery.$invalid"> 
     payment fields 
     <button type="submit" ng-disabled="orderForm.$invalid && shipping.$invalid && payment.$invalid && delivery.$invalid">Submit All</button> 
    </div> 
    <div> 
     <button type="button" ng-click="showPaymentForm ? (showPaymentForm = false; showDeliveryForm= true):showDeliveryForm ? (showDeliveryForm=false; showShippingForm = true):showShippingForm = true">Prev</button> 
    </div> 

</form> 
+0

Che cosa sto facendo una forma di pagamento. Quello che voglio fare è disabilitare il pulsante di invio se il modulo non è valido e quando fai clic sul pulsante di invio quando tutti i campi del primo modulo sono validi rimuovi questo elemento dal DOM: '

' e rimuovi l'attributo disabilitato dei campi. La direttiva ng-form non funziona in IE8 e sfortunatamente per me devo dare soperte a IE8 – Fanatic

+0

Se vuoi supportare IE8 non usare angular.js O devi usare una versione precedente e precedente. Solo jquery smette di supportare anche IE8 per molto tempo. Ti consiglio di non pensare al supporto IE8. Pensa alla mobilità invece di IE8. Perché è morto ... –

+0

Sono completamente d'accordo con te Mehmet Orkun ma questo non dipende da me. Dove lavoro ancora dare supporto a IE 8. Per il mio lavoro personale non dare mai supporto IE8 – Fanatic

0

Se il pulsante di invio è al di fuori della forma, allora si può avvolgere il pulsante e form con un ngForm (sì, ngForms può essere annidato). Assegna un nome al tuo ngForm in modo che tu possa gestire il clic di invio e fare riferimento all'oggetto del modulo nello stesso contesto

22

L'indizio sta utilizzando la direttiva ngForm e assegna un attributo nome modulo che fa riferimento a $ rootScope.

<form name="$root.myForm" id="form_id"> 
    <input type="text" name="myField" required> 
</form> 

<button form="form_id" ng-disabled="$root.myForm.myfield.$invalid"> 
    Submit 
</button> 

Che funziona.

+4

non è necessario aggiungerlo a $ rootScope - è sufficiente creare un oggetto titolare nel controller corrente, ad esempio, 'current = {}' e quindi utilizzare '

' –

+3

Solo una nota che l'attributo' form' non funziona in qualsiasi IE. http://caniuse.com/#feat=form-attribute – jreptak

+0

Grazie amico, hai salvato il mio modulo: P. –

0

Ancora più conciso rispetto this answer:

<form name="myForm"> 
    <input type="text" name="myField" required> 
</form> 

<button ng-disabled="myForm.myField.$invalid"> 
    Submit 
</button> 

(Si noti che non è nemmeno necessario definire myForm nel controllore sottostante e si può anche omettere l'attributo form.)

+0

Questa soluzione funziona ma con un piccolo problema, il 'ng-message' per' $ error'on diversi elementi non vengono mai chiamati, cioè, i messaggi di errore associati agli elementi del modulo, se presenti, non vengono chiamati. –

Problemi correlati