Простая форма отправки с использованием Angular

Я новичок в Angular, но очень стар в Google.

Я не могу понять, как отправить эту форму с помощью Angular, например, как мы это делаем в jQuery.

<form>
   <input type="text" />
   <button type="button" class="saveDraft">Save Draft</button>
   <button type="submit">Submit</button>
<form>

Я хочу отправить эту форму с помощью кнопки сохранения черновика, а не обычной кнопки отправки.

jQuery мы используем

$('.saveDraft').click(function () {
    $('form').submit(); // this will submit form 
});

person Basit    schedule 03.11.2015    source источник
comment
могу я узнать, почему вы хотели сделать именно так. Собираетесь ли вы выполнять пользовательскую проверку внутри этой функции click?   -  person Pankaj Parkar    schedule 03.11.2015
comment
Да, я хочу установить скрытое значение перед отправкой формы.   -  person Basit    schedule 03.11.2015


Ответы (3)


У вас может быть директива ng-submit для form. Когда вы нажимаете кнопку отправки, она вызывает метод, указанный в директиве ng-submit.

Разметка

<form name="myForm" ng-submit="submit()">
   <input name="name" type="text" ng-model="name"/>
   <button>Save Draft</button>
   <button type="submit">Submit</button>
<form>

Прочтите здесь как работают формы в AngularJS?

Обновление 1

Если вы хотите выполнить проверку кнопки click, но сделать ее тип как button, это будет выглядеть примерно так, как показано ниже, с использованием директивы ng-click

Разметка

<form name="myForm" ng-submit="submit()">
   <input name="name" type="text" ng-model="name"/>
   <button type="button" ng-click="manualSubmit()">Save Draft</button>
   <button type="submit">Submit</button>
<form>

Код

$scope.manualSubmit = function(){
   //do your the process of adding hidden fields.
   //then submit a form
   //if you don't want to submit on some cases then put it in condition block
   $('form').submit(); // this will submit form 
}

Но технически я бы не предпочел использовать этот подход, используя jQuery с циклом дайджеста Angular.

Если бы вы действительно хотели добавить поле hidden внутри формы, я бы оставил их на самом form, а не добавлял их динамически перед отправкой формы. И будет использовать директиву ng-submit.

Для заполнения этих скрытых значений вы можете использовать директиву ng-value с переменной области видимости в ней. Что будет делать эта директива ng-value, так это обновить это скрытое поле, предположим, что значение scopeVariable изменено из-за того, что контроллер обновит значение скрытого поля.

<form name="myForm" ng-submit="submit()">
   <input name="name" type="text" ng-model="name"/>
   <input type="hidden" name="somehiddenfield" ng-value="scopeVariable"/>
   <button>Save Draft</button>
   <button type="submit">Submit</button>
<form>

Обновление 2

В соответствии с комментарием вы хотели отправить форму вручную, используя angular, для этого у вас может быть директива, которая отправит form. В таком случае вам не нужен ng-submit.

Разметка

<button type="button" my-submit="callback()">Save Draft</button>

Директива

app.directive('mySubmit', function(){
  return {
     restrict: 'A',
     link: function(scope, element, attrs){
        element.on('click', function(event){
            //do stuff before submitting
            element.parent.submit(); //manually submitting form using angular
            if(attrs.callback)
               scope.$eval(attrs.callback);
        })
     }
  }
})

Обновление 2 Plunkr

person Pankaj Parkar    schedule 03.11.2015
comment
@Basit, когда вы не упоминаете атрибут type в button, по умолчанию он считается submit, однако, когда вы нажимаете Save Draft, он отправляет for с полями ввода. - person Pankaj Parkar; 03.11.2015
comment
Я удалил голосование против. но $('form').submit() использует jQuery, и я не хочу включать библиотеку jquery только для отправки формы. мы не можем сделать это из angular? Мне просто нужно установить $scope.draft = 1; и отправить форму.. - person Basit; 03.11.2015
comment
@Basit, что именно собирается делать submit() .. Я не вижу никакого атрибута action в вашем form, так что это не имеет никакого значения .. в основном это будет запускать только событие submit - person Pankaj Parkar; 03.11.2015
comment
У меня есть огромная форма, которую я не могу вставить сюда, чтобы запутать людей. Вот почему я оставил его маленьким и простым. обычная отправка покажет значения для публики, но если пользователь хочет сохранить как черновик, он нажмет на ссылку или обычную кнопку, которая изменит значение и отправит форму. Я все еще не понимаю, как отправить форму из функции с помощью angular. - person Basit; 03.11.2015
comment
@Basit, посмотрите на мое обновление ... что вы сказали в своем предпоследнем комментарии ... вам нужно установить $scope.draft = 1? - person Pankaj Parkar; 03.11.2015
comment
Я тестировал вашу директиву, и она выдает эту ошибку formCtrl.submit не является функцией - person Basit; 03.11.2015
comment
@Basit попробуйте отредактировать .. убедитесь, что require: '^form', есть, а функция ссылки имеет параметр formCtrl на 4-м месте - person Pankaj Parkar; 03.11.2015
comment
Извинения @Basit. Я думал, что внутри ngFormController есть submitEvent, но его нет, вам нужно инициировать событие вручную, вызвав событие submit в этой DOM с помощью jQuery.. - person Pankaj Parkar; 03.11.2015
comment
хорошо Спасибо за попытку. может быть, нажмите кнопку отправки из кнопки черновика, это решит? - person Basit; 03.11.2015
comment
У меня уже загружено более 10 скриптов, я не хочу добавлять jquery. сценарий использует jquery, который я избегаю использовать :) - person Basit; 03.11.2015
comment
Спасибо за помощь. Я тоже проголосовал. но простой чистый javascript сделал свою работу благодаря Adjit -on stackoverflow.com/questions/33508617/ - person Basit; 03.11.2015
comment
Я не предпочитаю это. Потому что вы выбрали селектор ... чего я боюсь ... добавление селектора внутри директивы сделает его конкретным, что дом ... должен иметь этот селектор ... - person Pankaj Parkar; 03.11.2015

Вот вам пример:

<form ng-submit="submit()" ng-controller="ExampleController">
  Enter text and hit enter:
  <input type="text" ng-model="text" name="text" />
  <input type="submit" id="submit" value="Submit" />
  <pre>list={{list}}</pre>
</form>

И документация:

https://docs.angularjs.org/api/ng/directive/ngSubmit

person uksz    schedule 03.11.2015
comment
извините, это не отвечает на вопрос, который я задавал - person Basit; 03.11.2015

вы просто замените свой код этим

<form name="myForm" ng-submit="submit()" action=" name of other page" autocomplete="on">`

<input name="name" type="text" ng-model="name"/> <button onClick="draft(this.form)">Save Draft</button> <button type="submit" name="submit">Submit</button>

person vipin kumar    schedule 03.11.2015
comment
извините, но как эта форма отправки может быть сохранена с помощью кнопки сохранения черновика type=button? - person Basit; 03.11.2015
comment
вы можете передать текущий объект формы следующим образом.... ‹button onClick=draft(this.form)›Сохранить черновик‹/button› - person vipin kumar; 03.11.2015
comment
вопрос в том, как отправить форму с обычной кнопки или ссылки. - person Basit; 03.11.2015