2013-04-10 5 views
19

Я создаю форму, которая генерирует приглашение при отправке. В приглашении есть несколько полей, один из которых представляет собой адрес электронной почты с кнопкой «добавить», который при щелчке должен добавить этот адрес в список адресов электронной почты, которые должны получить приглашение.AngularJS - Как сгенерировать отправку во вложенной форме

Это может быть сделано с помощью одной формы, однако, если пользователь нажимает клавишу ввода при вводе электронной почты, он вызывает submit на всей форме. Я хотел бы получить результат ввода ключа - когда поле ввода электронной почты сфокусировано - имеет тот же эффект, что и нажатие кнопки «добавить». Я ожидал, что правильный способ решения этой проблемы было бы гнездиться письмо форма ввода в форму приглашения, что-то вроде этого:

<ng-form ng-submit="sendInvite()"> 
     <input type="text" placeholder="Title" ng-model="invitation.title"/> 

     <ng-form ng-submit="addInvitee()"> 
      <input type="email" placeholder="Title" ng-model="inviteeEmail"/> 
      <button class="btn" type="submit">add</button> 
     </ng-form> 

     <button class="btn" type="submit">Send</button> 
    </ng-form> 

Со следующим JavaScript в контроллере:

$scope.addInvitee = function() { 
     $scope.invitation.emails.push($scope.inviteeEmail); 
     $scope.inviteeEmail = ''; 
    } 

    $scope.sendInvite = function() { 
     //code to send out the invitation 
    } 

Моя проблема в том, что имеющие вложенные формы (и при этом преобразуются из <form> в <ng-form>, не представляя ни один больше не работает.

Plunker here

+0

формы Validate и или предоставить приглашение ... «Вы представляете ....» с возможность отменить, если они не сделали – charlietfl

+0

Спасибо, что, безусловно, способ смягчить проблему, но это не идеальное поведение. –

+0

также может помешать 'enter' по умолчанию, когда поле находится в фокусе. Привяжите обработчик ключа к полю и отвяжите размытие. Невозможно вставить формы – charlietfl

ответ

8

Вы можете использовать один из следующих способов, чтобы указать, какой метод Javascript должен быть вызван, когда форма была отправлена:
* ngSubmit директива на элементе формы
* ngClick директива на первой кнопке или поле ввода типа подать (ввод [тип = представить])
- form docs

<ng-form> 
    <input type="text" placeholder="Title" ng-model="invitation.title"><br> 
    <ng-form> 
    <input type="email" placeholder="Title" ng-model="inviteeEmail"> 
    <button class="btn" ng-click="addInvitee()">add</button><br> 
    </ng-form> 
    <ul class="unstyled"> 
    <li ng-repeat="invitee in invitation.invitees"> 
     <span>{{invitee.email}}</span> 
    </li> 
    </ul> 
    <button class="btn" ng-click="sendInvite()">Send</button> 
</ng-form> 

Plunker

+0

Спасибо, это улучшение от того, что у меня было, но оно вообще не реагирует на событие «enter». После некоторого вовлечения, казалось бы, элементы '

' и '' не так идентичны, как требование к документам. I [forked] (http://plnkr.co/edit/mssWTbMyZCTtKuq5tYDJ?p=preview) ваш Plunker экспериментирует с различными конфигурациями 'form',' ng-form' и 'ng-submit' безрезультатно. Есть ли у вас представление о том, как я могу получить условный ответ на событие «enter», которое я описал первоначально? (За исключением ключевого обработчика или пользовательской директивы) –

+0

@JamieA, извините, я пропустил часть ввода ключа ввода (я остановил ваш Plunker и изменил его, но я только тестировал нажатие на кнопки). Я думаю, вам нужно будет создать директиву для получения необходимой функциональности. –

+1

Внутренняя подача ничего не делает здесь. Он работает из-за ng-click. Угловая, похоже, не хочет работать с подачей на внутренние формы. Правильно работающий submit может использовать ng-submit. Внутренняя подача не может. –

8

I'v e аналогичное требование - многошаговая форма, управляемая мастером. Когда пользователь нажимает кнопку «Далее», я должен проверить текущую форму шага.

Мы можем активировать проверку путем стрельбы '$validate' событие на scope связано с формой.

isFormValid = function($scope, ngForm) { 
    $scope.$broadcast('$validate'); 
    if(! ngForm.$invalid) { 
     return true; 
    } 
} 

Если когда-нибудь я хочу, чтобы проверить, если значения формы являются правильными, я буду называть isFormValid с формой, например сфера &.

Рабочий код: Plunker link

Это также полезно иметь некоторые дополнительные логики в isFormValid(входит в вышеприведенном Plunker) который делает форму & поля формы $dirty как бы показа/скрытия сообщений проверки на основе на их $dirty состоянии.

+0

Основываясь на коде плункера, я бы порекомендовал также переключать состояние '$ pristine', поскольку он не переключается автоматически при установке поля' $ dirty'. Хорошая работа, спасибо за решение! – pulkitsinghal

+0

На момент написания (AngularJS <1.2), нет простого способа сбросить состояние '$ pritine'. Мы могли бы сбросить состояние '$ pristine' конкретного элемента управления или формы. Но мы также должны распространять это изменение, если какой-либо из других элементов управления в его форме или его родительская форма также являются '$ первозданными'. Это связано с гораздо большим. Из 1.2 существует метод для этого: '$ setPristine (..)'. – manikanta

0

Когда форма отправлена, вы можете найти все вложенные формы, используя некоторые вещи, как показано ниже

forms = [] 
forms.push(form) 
nestedForms = _.filter(_.values(form), (input) -> (input instanceof form.constructor) and (input not in forms)) 

Здесь формы является внешним видом контроллера, который был представлен. Вы можете подключить этот код к ur onsubmit и найти все вложенные формы и сделать все, что вам нужно.

Примечание: Это CoffeeScript

Смежные вопросы