【发布时间】:2015-06-01 02:49:44
【问题描述】:
我在 ng-repeat 中嵌套了一个带有按钮的表单,该按钮的点击事件调用了一个函数,该函数执行了一些事情,包括 $scope.$broadcast。函数中的所有内容都会触发一次,除了在 ng-repeat 中的每个项目上触发的广播。
我无法将按钮移到重复之外,否则我会丢失表单和数据引用。我有一个演示 plunker,它显示了基本设置。如果您在其中一个输入中输入值并在监视控制台时单击下一步,您应该会看到广播多次触发(每个 ng-repeat 项目一次)。我需要的是一种方法,让广播只触发一次,同时仍然根据演示代码保持对表单的引用以进行验证检查。
这里是JS,其余在plunker:
(function () {
var app = angular.module('App', []),
/** manually triggers $validate event to validate the given form */
isFormValid = function ($scope, ngForm) {
var i = null;
//$scope.$emit('$validate');
$scope.$broadcast('$validate');
if(! ngForm.$invalid) {
return true;
} else {
// make the form fields '$dirty' so that the validation messages would be shown
ngForm.$dirty = true;
for(i in ngForm) {
if(ngForm[i] && ngForm[i].hasOwnProperty && ngForm[i].hasOwnProperty('$dirty')) { // TODO: is 'field.$invalid' test required?
ngForm[i].$dirty = true;
}
}
}
};
app.controller('appCtrl', ['$scope', function ($scope) {
$scope.wizardStep = 1;
$scope.nextStep = function () {
var ngForm = $scope['stepForm_' + $scope.wizardStep];
if(isFormValid($scope, ngForm)) { // trigger manual validation
$scope.wizardStep++;
}
};
$scope.prevStep = function () {
$scope.wizardStep--;
};
$scope.submit = function () {
var ngForm = $scope['stepForm_' + $scope.wizardStep]; // we can make this line common
if(isFormValid($scope, ngForm)) {
alert('Form is valid. Submitting...');
}
};
}]);
})();
非常感谢任何帮助或想法,我知道诸如 html 中的样式和演示代码的其他方面之类的东西是禁止的。我这样做只是为了让 plunkr 更快。
TIA
【问题讨论】:
标签: javascript angularjs forms broadcast