2015-07-28 9 views
2

Мой код выглядит примерно так -угловых JS' в форме ввода

<form name="myForm" ng-submit="!myForm.phone.$isEmpty(this.$viewValue)" action="/my/url" method="get"> 
<input name="phone"> 
<button type="submit">submit</button> 
</form> 

Теперь я не могу отправить форму, даже если я заполнить поле номер телефона.

Но если я код так:

<form name="myForm" ng-submit="!myForm.phone.$isEmpty(myForm.phone.$viewValue)" action="/my/url" method="get"> 
<input name="phone"> 
<button type="submit">submit</button> 
</form> 

Его прекрасно работает.

Таким образом, трудность заключается в «этом». Я не могу даже проверить контекст этого, это должен быть контекст $ scope.myForm.phone, но почему-то это не так. Может кто-то объяснит.

+0

Значит ли это, что даже если я хочу, чтобы контекст был myForm.phone, я не могу сделать это на мой взгляд? поскольку контекст всегда будет родительским, т. е. областью. Разве это не нарушает нормальное javascript-поведение лексического охвата? –

+0

Нет, у вас нет силы изменить область действия. Однако, если вы реализуете [настраиваемую директиву] (http://plnkr.co/edit/deAQoIw4KfekIh3ZOt1j?p=info) и применитесь к входам в форме, директива будет обладать областью поля, так как она будет ссылаться на 'ng-model' поля –

ответ

3

Это не то, что ng-submit для. ng-submit - это функция или выражение, вызываемое при отправке формы. Это не имеет никакого отношения к проверке. Если вы хотите, чтобы текстовое поле не было пустым перед его отправкой, вам просто нужно добавить required, а затем, если он пуст, myForm.$invalid будет правдой.

Является ли это то, что вы пытаетесь сделать:

HTML

<form name="myForm" ng-submit="submit(phone)"> 
    <input name="phone" type="text" ng-model="phone.value" required> 
    <button type="submit" ng-disabled="myForm.$invalid" >submit</button> 
</form> 

контроллер

$scope.submit = function(phone){ 
    console.log('phone', phone); 
} 

$scope.phone = { 
    value: '' 
}; 

обновление

this, который вы передали в ng-submit, является ссылкой на ваш контроллер. Так как у вас есть атрибут name, установленный на myForm, вы можете получить доступ к форме модели через this.myForm, а модель телефона - this.myForm.phone. Так что если вы хотите использовать $isEmpty, чтобы проверить, если поле пусто вы должны использовать:

this.myForm.phone.$isEmpty(this.myForm.phone.$viewValue) 
+0

Поле ввода не является обязательным. Не требуется. Почему это условие связано с тем, что в моем коде позже может быть несколько полей ввода, и все они не являются обязательными. Только условие состоит в том, что один из них должен быть заполнен. Я нашел самый короткий способ использования $ isEmpty. Но я согласен с тем, что ng-submit не следует использовать так.
Но не могли бы вы объяснить, почему я не могу использовать контекст myForm.phone внутри функции $ isEmpty()? –

+0

Был удивлен, узнав, что 'this' доступен в шаблонах и [ссылается на текущую область действия] (http://plnkr.co/edit/wSkhcLSoC77wJoE9y1La?p=preview), а не на контроллер. Но вы правы, можно достичь formController, поскольку он находится в объекте области –

2

ng-submit используются для обеспечения обработчика для того момента, когда форма была отправлена. Что вы ищете, отключив submit кнопку с ng-disabled

<form name="myForm" ng-submit="functionInController()" action="/my/url" method="get"> 
<input name="phone" required> 
<button type="submit" ng-disabled="myForm.$invalid">submit</button> 
</form> 

Обратите внимание на required директивы добавлены к входу. Который гарантирует, что это поле не пусто для отправки

+0

Хороший ответ. Хотя мне кажется, что для ввода потребуется ввести директиву 'ng-model', для которой валидация будет действовать. –

+0

@MattHerbstritt хорошо, это зависит. В последнее время я выкапывал сложный вопрос о формах в угловом. И я узнал, что все угловые директивы для проверки формы (max, min, required и т. Д.) На самом деле являются обертками вокруг атрибутов браузера. Они предоставляют дополнительную (угловую) функциональность, но все же обрабатываются браузерами. Вот почему вы можете добавить 'required', и не будет способа отправить форму, пока поле пусто. Однако, если вы предоставляете выборочную проверку, недопустимое состояние формы (в угловом) не мешает ему отправлять. И вы должны добавить 'ng-disabled', чтобы управлять им вручную –

+0

Привет. Спасибо за инвалиды, инвалиды и другие вещи. Но то, что на самом деле заинтриговало меня, - это определение «это», когда я пытался использовать его внутри $ isEmpty(). На самом деле есть 2 входа, оба они являются необязательными, поэтому не требуется использовать требуемый атрибут. Но один из них должен быть заполнен. Я видел в угловом js, что если поле ввода не загрязнено, тогда поле также допустимо, поэтому здесь не нужно использовать $ invalid. –

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