У меня есть Угловое на основе формы, для которых я хочу, чтобы применить конкретные проверки:Угловая Пользовательские проверки вложенных атрибутов
<form name="createProject" novalidate>
<span ng-show="createProject.projectName.$invalid">Please enter a name for the project.</span></br>
<input type="text" ng-model="newProject.project.name" name="projectName" placeholder="Project Name" required>
<div ng-repeat="topic in newProject.project.topics_attributes">
<span>Topic {{$index + 1}}</span>
<input type="text" ng-model="topic.name" placeholder="Topic Name">
<input type="text" ng-model="topic.feed_size">
<div ng-repeat="topic_source in topic.topic_sources_attributes">
<span>Topic {{$parent.$index + 1}} Source {{$index + 1}}</span>
<select ng-model="topic_source.platform" ng-options="platform for platform in platforms" topic-source-required parent="$parent.topic.name">
<option value="">-- platform --</option>
</select>
<input type="text" ng-model="topic_source.keywords" placeholder="Topic Keywords" topic-source-required parent="$parent.topic.name">
<button ng-show="$last" ng-click="addTopicSource($parent.topic)">Add Topic Source</button>
</div>
</div>
<button ng-click="addTopic()">New Topic</button>
<input type="submit" ng-click="addProject()" ng-class="{ disabled: createProject.$invalid }" ng-disabled="createProject.$invalid" value="Add Project">
</form>
<a href="#">Back</a>
В форме, проект может иметь ноль или несколько разделов. Каждая тема должна содержать как минимум один источник темы. В принципе, я хочу создать проверку, которая проверяет, добавляется ли тема (добавлено, определяется как имеющая имя), и если это так, то требуется, чтобы она содержала по крайней мере один topic_source с полями платформы и ключевого слова, связанными с ним.
Возможно ли это? Я не очень хорошо знаком с пользовательской проверкой Angular, поэтому я не уверен, как начать реализацию чего-то подобного.
** Редактировать **
Текущий прогресс в директиве пользовательские проверки:
angular.module('dashboard').directive 'topicSourceRequired', ($parse) ->
require: "ngModel"
link: (scope, elem, attrs, ctrl) ->
topicName = $parse attrs.parent
scope.$watch topicName, (topicName) ->
ctrl.$parsers.unshift checkForExistence if topicName
checkForExistence = (topicSource) ->
if topicSource
ctrl.$setValidity "topicSourceRequired", true
else
ctrl.$setValidity "topicSourceRequired", false
topicSource
Хорошо, ближе к этой проверке. В настоящее время проверка, похоже, проверяет, имеют ли два поля topic_source значения независимо от того, имеет ли поле имени родителя значение, а поля topic_source регистрируются как недопустимые, если поле было введено и затем стерто.
Как убедиться, что функция checkForExistence вызывается только в том случае, когда topicName имеет непустое строковое значение? Во-вторых, как я могу убедиться, что пустые поля недействительны, не изменяя их каким-то образом?
Я не совсем понимаю. Вы хотите связать проверку с моделью, а затем проверить, правильно ли отформатирована модель? Как узнать, где атрибут ошибки в DOM? –
Извините за то, что вы не полностью поняли. Все, о чем я говорю, это то, что вам нужно понять, как работают формы и их содержащиеся в них входы, чтобы выполнить выборочную проверку. AngularJS блестяще позволяет вам это делать, но, как и все, требуется время, чтобы учиться. Ссылка, которую я опубликовал выше, возможно, не самое лучшее место для начала - попробуйте здесь: https://docs.angularjs.org/guide/forms – Fordio
Хорошо, я думаю, что я начинаю понимать, как это работает. Я создал директиву с помощью $ watch, чтобы определить, было ли внесено изменение в родительскую область $ (тема) и проверить, имеют ли поля topic_source значения. Проблема в том, что $ watch только проверяет, когда поля первоначально добавлены, и функция проверки значений никогда не запускается. Я не совсем уверен, как получить $ watch, чтобы проверить какие-либо изменения модели и как заставить ее вызывать функцию контрольных значений. –