2013-04-14 18 views
32

Bir denetleyiciden geleneksel bir form gönderme yapmak istiyorum. Bu senaryo, web sunucumda bir rotaya vurmak ve HTML'deki normal bir formla yapabildiğim yanıtına yeniden yönlendirmek, ancak aynı zamanda gönder düğmesine basıldığında kendi alanlarında bazı doğrulama yapmak istiyorum ve Doğrulama başarısız olursa rotayı yapmak istemiyorum.Bir denetleyiciden bir form gönderebilir miyim?

Geçerli olduğunu biliyordum, ancak yalnızca düğmenin vurulduğu sırada doğrulama yapılmasını istiyorum.

Bir denetleyici içinden bir form göndermek şartlı olarak bir yolu var mı?

cevap

8

Formunuzdaki ng-submit yönergesini kullanmaya çalıştınız mı? Doğrulama işleminden sonra doğru/yanlış döndürebilirsiniz.

Kontrolör

app.controller('MainCtrl', ['$location', function($scope, $location) { 
    $scope.submit = function(user) { 
    var isvalid = true; 
    // validation 
    if (isvalid) { 
     $http.get('api/check_something', {}).then(function(result) { 
      $location.path(result.data); 
     }); 
     return true; 
    } 
    return false; //failed 
    } 
}); 

Html (eğer bir eylem niteliği olmamalıdır)

sadece dışarı sağ formu geçerlidir kadar düğmeye göndermek devre dışı bırakma hakkında nasıl
<form name="formuser" ng-submit="submit(user)"> 
    <input type="text" ng-model="user.firstname" /> 
    <input type="text" ng-model="user.lastname" /> 
    <button type="submit">Submit</button> 
</form> 
+2

Bu düşüncem vardı, ancak bir eylem belirtmem gerekiyordu. –

+0

Bu, OP'nin sorduğu şeyin tam tersidir. Bu, html form gönderimi tetiklenmeden önce bir çeşit "kanca" ekler. OP, halihazırda çalışan gönderiye nasıl bir kanca ekleneceğini değil, açısal denetleyiciden bu form gönderimini nasıl tetikleyeceğini sorar. – Piero

33

FormController'a gönderme yöntemi ekleyebilirsiniz. Ben öyle yaptım:

<form ng-form-commit action="/" name='payForm' method="post" target="_top"> 
    <input type="hidden" name="currency_code" value="USD"> 
    <button type='button' ng-click='save(payForm)'>buy</button> 
</form> 

.directive("ngFormCommit", [function(){ 
    return { 
     require:"form", 
     link: function($scope, $el, $attr, $form) { 
      $form.commit = function() { 
       $el[0].submit(); 
      }; 
     } 
    }; 
}]) 

.controller("AwesomeCtrl", ["$scope", function($scope){ 
    $scope.save = function($form) { 
    if ($form.$valid) { 
     $form.commit(); 
    } 
    }; 
}]) 
2

Bu bunu yapmak için 'değil Açısal' yoldur ama vanilya javascript kullanarak form gönderebilirsiniz. Örneğin formu bir kimlik vermek ve bunu yapabilirsiniz:

document.getElementById('myForm').submit()

veya bir gönder düğmesi varsa bunu tıklayabilirsiniz:

document.getElementById('myForm-submit').click()

İlk kurşunun vermedi bulundu Veri bağlamalarını (bunu Angular alternatifi olmayan JQuery widget'ına sahip bir projede kullanıyordum), ancak ikincisi bağlayıcıları saklıyordu. Bunun JQuery widget'ının nasıl yazıldığını bilmesi gerektiğini düşünüyorum.

Burada vanilya JS formları tetikleyen hakkında daha fazla görebilirsiniz:

How to submit a form using javascript?

0

formu göndermeden önce bir değeri değiştirmek istediğiniz eğer, @ dan ReklatsMasters yanıtını genişletilmesi, bunu böyle yapabilirdi ...

<form ng-form-commit action="/" name='payForm' method="post" target="_top"> 
    <input type="hidden" id="currency_code" name="currency_code" value="USD"> 
    <button type='button' ng-click='save('GBP', payForm)'>buy</button> 
</form> 

.directive("ngFormCommit", [function(){ 
    return { 
     require:"form", 
     link: function($scope, $el, $attr, $form) { 
      $form.commit = function($newCurrency) { 
       $el[0].querySelector('#currency_code').value = $newCurrency; 
       $el[0].submit(); 
      }; 
     } 
    }; 
}]) 

.controller("AwesomeCtrl", ["$scope", function($scope){ 
    $scope.save = function($newCurrency, $form) { 
    if ($form.$valid) { 
     $form.commit($newCurrency); 
    } 
    }; 
}]) 
İlgili konular