2015-01-06 16 views
7

Tôi có phần tử biểu mẫu được tạo bằng AngularJS có nút gửi bên trong và tôi muốn đặt nút này bên ngoài biểu mẫu này. Làm thế nào tôi có thể làm điều đó với Angular và có hình thức của tôi vẫn còn xác nhận?Làm cách nào để xác thực biểu mẫu khi nút gửi ở bên ngoài biểu mẫu này, với angularJs?

ví dụ mã html chính:

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

ví dụ mẫu mã 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> 

ví dụ mã điều khiển:

(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 

ví dụ app.js đang

(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

Không phải là góc được xây dựng trên jQuery để bạn có thể chỉ cần đính kèm một trình lắng nghe sự kiện để gửi biểu mẫu khi một phần tử nhấp bằng cách sử dụng .send()? do đó, như:

+0

Điều tôi muốn làm là giữ nút gửi bị tắt nếu các trường biểu mẫu chưa hoàn thành và khi bạn nhấp vào nút để bật biểu mẫu sau. Nhưng điều này không hiệu quả với tôi nếu tôi có các nút bên ngoài biểu mẫu – Fanatic

+0

Có thể hoàn toàn có thể với các chỉ thị ng được đưa ra? hoặc một cái gì đó tương tự? –

Trả lời

3

Như tôi đã hiểu Bạn cố gắng thực hiện biểu mẫu wizzard. Tuy nhiên bạn không cần nhiều phần tử biểu mẫu, Chỉ cần sử dụng một phần tử biểu mẫu ở trên cùng. Đối với hình thức trẻ em sử dụng hình thức ng-form để valiadate chúng một cách riêng biệt.

Bạn có thể tìm tài liệu chi tiết https://docs.angularjs.org/api/ng/directive/ngForm về việc sử dụng ng-form

Something như thế này

<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

Tôi đang làm một hình thức thanh toán. Những gì tôi muốn làm là vô hiệu hóa nút gửi nếu biểu mẫu không hợp lệ và khi bạn nhấp vào nút gửi khi tất cả các trường của biểu mẫu đầu tiên hợp lệ sẽ xóa mục này khỏi DOM: '

' và xóa thuộc tính bị vô hiệu hóa của các trường. Chỉ thị ng-form không hoạt động trong IE8 và không may với tôi phải cung cấp cho soperte cho IE8 – Fanatic

+0

Nếu bạn muốn hỗ trợ IE8 không sử dụng angular.js Hoặc bạn phải sử dụng phiên bản cũ hơn và cũ hơn. Chỉ cần jquery dừng hỗ trợ IE8 trong một thời gian dài. Tôi khuyên rằng, đừng nghĩ về hỗ trợ IE8. Hãy suy nghĩ về tính di động thay vì IE8. Bởi vì nó đã chết ... –

+0

Tôi hoàn toàn đồng ý với bạn Mehmet Orkun nhưng điều này không phụ thuộc vào tôi. Nơi tôi làm việc vẫn hỗ trợ cho IE 8. Đối với công việc cá nhân của tôi không bao giờ hỗ trợ IE8 – Fanatic

0

Nếu nút gửi là bên ngoài của mẫu đơn, sau đó bạn có thể bọc nút của bạn và hình thức với một ngForm (có, ngForms có thể được lồng nhau). Đặt tên cho ngForm của bạn để bạn có thể xử lý cú nhấp gửi và tham chiếu đối tượng biểu mẫu theo tên trong cùng một ngữ cảnh phạm vi

22

Đầu mối đang sử dụng lệnh ngForm và gán thuộc tính tên biểu mẫu tham chiếu đến $ 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> 

Điều đó có hiệu quả.

+4

bạn không cần phải thêm nó vào $ rootScope - bạn chỉ có thể tạo một đối tượng giữ trong bộ điều khiển hiện tại của bạn, ví dụ, 'current = {}' và sau đó sử dụng '

' –

+3

Chỉ cần lưu ý rằng thuộc tính' form' không hoạt động trong bất kỳ IE nào. http://caniuse.com/#feat=form-attribute – jreptak

+0

Cảm ơn bạn, bạn đã lưu biểu mẫu của tôi: P. –

0

Thậm chí ngắn gọn hơn this answer:

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

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

(Lưu ý rằng bạn thậm chí không cần phải xác định myForm trong bộ điều khiển cơ bản và bạn cũng có thể bỏ qua các thuộc tính form.)

+0

Giải pháp này không hoạt động nhưng với một vấn đề nhỏ, 'ng-message' cho' $ error'on các phần tử khác nhau không bao giờ được gọi, tức là các thông báo lỗi liên kết với các phần tử biểu mẫu, nếu có, không được gọi. –

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