将 AngularJS ng-form 对象传递给 ng-if?
Passing AngularJS ng-form object into ng-if?
当我在此处单击 "preview" 时,我的预览模式中的保存按钮未被禁用 http://plnkr.co/edit/I3n29LHP2Yotiw8vkW0i
我认为这是因为表单对象 (testAddForm) 在 ng-if 的范围内不可用。我知道我应该在我的控制器中使用一个对象,因为它一直向下传递,但是表单对象是由 angular 创建的,在 ng-if 中不可用。我该如何解决这个问题?
<!DOCTYPE html>
<html ng-app="app">
<head>
<script data-require="angular.js@1.2.27" data-semver="1.2.27" src="https://code.angularjs.org/1.2.27/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-controller="TestController">
<form name="testAddForm" novalidate>
<div ng-if="!previewMode">
<input name="title" ng-model="data.title" required />
<p ng-show="testAddForm.title.$invalid && !testAddForm.title.$pristine" class="help-block">Title is required.</p>
<div>
<input type="button" value="Preview" ng-click="preview(true)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
<div ng-if="previewMode">
<h2>{{data.title}}</h2>
<div>
<input type="button" value="Cancel" ng-click="preview(false)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
</form>
</body>
</html>
JS:
angular.module('app', []);
angular.module('app').controller('TestController', ['$scope', function($scope) {
$scope.data = {};
$scope.previewMode = false;
$scope.preview = function(show) {
$scope.previewMode = show;
};
}]);
输入字段放在ng-if条件内,如果ng-if为假,里面的元素不在DOM。由于在预览模式下您的输入字段不在 DOM 中,因此在验证表单时不会考虑它。
一个简单的解决方法是使用 ng-show,如下所示:
<div ng-show="!previewMode">
作为解决方法,您可以尝试使用 ng-hide 和 ng-show 而不是 ng-if
<form name="testAddForm" novalidate>
<div ng-hide="previewMode">
<input name="title" ng-model="data.title" required />
<p ng-show="testAddForm.title.$invalid && !testAddForm.title.$pristine" class="help-block">Title is required.</p>
<div>
<input type="button" value="Preview" ng-click="preview(true)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
<div ng-show="previewMode">
<h2>{{data.title}}</h2>
<div>
<input type="button" value="Cancel" ng-click="preview(false)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
</form>
当我在此处单击 "preview" 时,我的预览模式中的保存按钮未被禁用 http://plnkr.co/edit/I3n29LHP2Yotiw8vkW0i
我认为这是因为表单对象 (testAddForm) 在 ng-if 的范围内不可用。我知道我应该在我的控制器中使用一个对象,因为它一直向下传递,但是表单对象是由 angular 创建的,在 ng-if 中不可用。我该如何解决这个问题?
<!DOCTYPE html>
<html ng-app="app">
<head>
<script data-require="angular.js@1.2.27" data-semver="1.2.27" src="https://code.angularjs.org/1.2.27/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-controller="TestController">
<form name="testAddForm" novalidate>
<div ng-if="!previewMode">
<input name="title" ng-model="data.title" required />
<p ng-show="testAddForm.title.$invalid && !testAddForm.title.$pristine" class="help-block">Title is required.</p>
<div>
<input type="button" value="Preview" ng-click="preview(true)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
<div ng-if="previewMode">
<h2>{{data.title}}</h2>
<div>
<input type="button" value="Cancel" ng-click="preview(false)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
</form>
</body>
</html>
JS:
angular.module('app', []);
angular.module('app').controller('TestController', ['$scope', function($scope) {
$scope.data = {};
$scope.previewMode = false;
$scope.preview = function(show) {
$scope.previewMode = show;
};
}]);
输入字段放在ng-if条件内,如果ng-if为假,里面的元素不在DOM。由于在预览模式下您的输入字段不在 DOM 中,因此在验证表单时不会考虑它。
一个简单的解决方法是使用 ng-show,如下所示:
<div ng-show="!previewMode">
作为解决方法,您可以尝试使用 ng-hide 和 ng-show 而不是 ng-if
<form name="testAddForm" novalidate>
<div ng-hide="previewMode">
<input name="title" ng-model="data.title" required />
<p ng-show="testAddForm.title.$invalid && !testAddForm.title.$pristine" class="help-block">Title is required.</p>
<div>
<input type="button" value="Preview" ng-click="preview(true)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
<div ng-show="previewMode">
<h2>{{data.title}}</h2>
<div>
<input type="button" value="Cancel" ng-click="preview(false)" />
<input type="button" value="Save" ng-disabled="testAddForm.$invalid"/>
</div>
</div>
</form>