2015-01-06 10 views
7

내 안에 제출 버튼이있는 AngularJS로 만든 양식 요소가 있는데이 버튼을이 양식 외부에 놓고 싶습니다. Angular로 어떻게 할 수 있습니까?제출 단추가이 양식의 외부에 있으며 angularJs가있는 경우 양식의 유효성을 검사하는 방법은 무엇입니까?

예컨대 메인 HTML 코드 :

<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 --> 

예컨대 양식 HTML 코드 :

<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> 

예컨대 컨트롤러 번호 :

(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 

예컨대 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

는 각 아닌가 jQuery에 내장되어 있으므로 .send()를 사용하여 요소를 클릭 할 때 양식을 제출하기 위해 이벤트 리스너를 부착 할 수 있습니까? 그래서 같은 <양식 ID = "폼"> <= "버튼"버튼 ID>

+0

양식 필드가 완료되지 않았거나 버튼을 클릭하여 다음 양식을 사용하도록 설정 한 경우 제출 버튼을 비활성화 된 상태로 유지하려고합니다. 그러나 이것은 폼 외부에있는 버튼을 가지고 있다면 나에게 효과가 없다. – Fanatic

+0

ng-directives를 사용하여 완전히 가능해야한다? 같은가요? –

답변

3

내가 알고있는대로 폼 위자드를 사용해보십시오. 그러나 여러 폼 요소가 필요하지 않습니다. 맨 위에 하나의 양식 요소 만 사용하십시오. 어린이 양식은 ng-form 지시어를 사용하여 별도로 평가해야합니다.

당신은 버튼을 제출하는 경우 NG 형식

뭔가 같은이

<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

나는 지불 방법을하고 있습니다. 내가하고 싶은 일은 양식이 유효하지 않은 경우 제출 버튼을 비활성화하고 첫 번째 양식의 모든 필드가 유효 할 때 제출 버튼을 클릭하면 DOM에서이 항목을 제거하고 '

'필드의 비활성화 된 속성을 제거합니다. ng-form 지시문은 IE8에서 작동하지 않으며 불행히도 IE8에 soperte를 부여해야합니다. – Fanatic

+0

IE8을 지원하려면 angular.js를 사용하지 마십시오. 이전 버전과 이전 버전을 사용해야합니다. jquery는 IE8도 오랫동안 지원하지 않습니다. IE8에 대한 지원을 생각하지 마십시오. IE8 대신 이동성에 대해 생각해보십시오. 그것은 죽었 기 때문에 ... –

+0

나는 당신과 완전히 동의한다. Mehmet Orkun 그러나 이것은 나에게 의존하지 않는다. 내가 일하는 곳은 여전히 ​​IE 8을 지원합니다. 내 개인적인 작업을 위해 절대 IE8을 지원하지 않습니다. – Fanatic

0

를 사용하는 방법에 대한 자세한 문서 https://docs.angularjs.org/api/ng/directive/ngForm을 찾을 수 있습니다 양식의 외부에, 당신은 당신의 버튼을 포장 할 수 있습니다 ngForm (예, ngForms는 중첩 될 수 있음)으로 양식을 작성하십시오. 같은 범위의 컨텍스트에서 제출 클릭을 처리하고 이름으로 양식 객체를 참조 할 수 있도록 ngForm에 이름을 지정하십시오.

22

실마리는 ngForm 지시문을 사용하고 $ 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> 

그게 효과가 있습니다.

+4

$ rootScope에 추가 할 필요가 없습니다. 현재 컨트롤러에 holder 객체를 생성 할 수 있습니다. 예를 들어'current = {}'와 같이 사용하고'

' –

+3

'form' 속성이 IE에서 작동하지 않는다는 것에주의하십시오. http://caniuse.com/#feat=form-attribute – jreptak

+0

감사합니다. 내 양식을 저장했습니다. P. –

0

더욱 간결 this answer 이상 :

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

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

(당신도 기본 컨트롤러에 myForm을 정의 할 필요가 없습니다 당신은 또한 form 속성을 생략 할 수 있습니다.)

+0

이 해결책은 효과가 있지만 작은 문제가 있으면 다른 요소에서'$ error'에 대한'ng-message '가 호출되지 않습니다. 즉, 폼 요소와 관련된 오류 메시지가 호출되면 호출되지 않습니다. –