Изменение формы и действительность в angularjs

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

<form name="form" novalidate>
    <input ng-model='input.a' required/>
    <input ng-model='input.b' required/>
    <input value='{{output.p | number: 2}}' readonly/>
    <input value='{{output.q | number: 2}}' readonly/>
</form>

Теперь при любом изменении input я хочу что-то сделать, когда input.a и input.b действительны. Я пробовал $watch(input), но это не сработало. Наблюдение за всеми его членами делает, но это кажется глупым. Добавление ng-change ко всем полям выглядит лучше, но все равно довольно глупо (не DRY). Как правильно?


Другой вопрос, как узнать, действителен ли ввод. Если бы у меня была кнопка, я мог бы просто

<button ng-click="doIt()" ng-disabled="form.$invalid">

но как я могу получить доступ к form.$invalid в контроллере (он не содержится в $scope)?


person maaartinus    schedule 27.03.2014    source источник


Ответы (2)


Вы должны иметь доступ к form.$invalid, выполнив

$scope.form.$invalid

См. здесь: AngularJs не может получить доступ к объекту формы в контроллере ($scope)

Чтобы следить за изменениями в форме, вы должны уметь:

$scope.$watchCollection('input')
person dave    schedule 27.03.2014
comment
Оба работают, большое спасибо. Но по вашей ссылке у меня должно работать без всяких setFormScope (я не делаю $modal.open ничего подобного, просто базовая страница с базовым ctrl), но не работает. Есть идеи? - person maaartinus; 27.03.2014

@dave уже ответил на ваш первый вопрос, но для второго у меня есть решение, которое я считаю более элегантным:

В вашем контроллере вы объявили объект, например:

$scope.forms = {};

Затем вы формируете имя, которое должно быть вложено внутри этого объекта:

<form name="forms.someForm">
    ...

Наконец, в вашем контроллере вы можете делать такие вещи:

if($scope.forms.someForm.$invalid) {
    ...
}
person Oliver    schedule 14.09.2014