У меня есть форма с несколькими разделами, и я хочу применить класс к разделу, если какие-либо поля в нем имеют определенный класс.
Моя идея состояла в том, чтобы следить за любыми полями с классом has-error
в разделе и отображать значок или что-то в заголовке раздела.
Каждое поле задает свой класс с помощью ng-class="{'has-error': !value, 'has-success': value}"
и похоже, что порядок обновления класса и срабатывание $watch
event вопросы.
У меня setup plunkr здесь: https://plnkr.co/edit/1isq3DXXUvSPW5ChYkuM?p=preview
Попробуйте удалить и ввести значение на вход, и вы увидите, что родительский класс не синхронизирован.
Html:
<head>
<link data-require="[email protected]" data-semver="3.3.6" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" />
<link data-require="[email protected]" data-semver="4.5.0" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.css" />
<script data-require="[email protected]" data-semver="2.2.0" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script data-require="[email protected]" data-semver="1.5.0" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
<script data-require="[email protected]" data-semver="3.3.6" src="bootstrap-js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-app="app">
<sws-form-section>
<sws-form-field label="Test"></sws-form-field>
</sws-form-section>
</body>
</html>
JavaScript:
var module = angular.module('app', []);
module.directive('swsFormSection', function() {
return {
link: function($scope, element) {
$scope.$watch(function() {
var errors = element.find('.has-error').length;
console.log('outer:' + errors);
return errors;
}, function(value) {
$scope.hasAnyErrors = value;
});
},
transclude: true,
template: '<div><label ng-class="{\'text-danger\': hasAnyErrors, \'text-success\': !hasAnyErrors}">Errors In Section: {{hasAnyErrors}}</label><div ng-transclude></div>'
};
});
module.directive('swsFormField', function() {
return {
link: function($scope, element) {
$scope.value = 'testar';
$scope.$watch(function() {
var errors = element.find('.has-error').length;
console.log('inner:' + errors);
return errors;
}, function(value) {
console.log('the value:' + $scope.value);
});
},
template: '<div class="form-group" ng-class="{ \'has-error\': !value, \'has-success\': value }"><label class="control-label">Test</label><input type="text" class="form-control" ng-model="value"></div><pre>{{value|json}}</pre>'
}
});
Согласно предложению Даниэля Беккса:
мой ответ был бы "не делай этого". В общем, вам гораздо лучше в Angular, наблюдая за моделью данных, а не наблюдая за DOM.
Я решил использовать уже существующие ng-допустимые классы и каждый раздел должен быть отдельной формой, публиковать форму в области и использовать форму. $ Valid свойство в заголовке раздела.
var module = angular.module('app', []);
module.directive('swsFormSection', function() {
return {
transclude: true,
template: '<form name="formSection"><i class="fa" ng-class="{ \'fa-check\': formSection.$valid, \'fa-pencil\': formSection.$invalid }"></i> My Section:<div ng-transclude></form>'
};
});
module.directive('swsFormField', function() {
return {
template: '<div class="form-group"><label class="control-label">Test</label><input type="text" required class="form-control" ng-model="value"></div><pre>{{value|json}}</pre>'
}
});
Обновлено plunkr: https://plnkr.co/edit/1isq3DXXUvSPW5ChYkuM?p=preview
ng-validate
? Затем вы можете просто проверить$valid
в форме вместо того, чтобы наблюдать кучу имен классов ...