我正在使用一个有点动态的AngularJS表单。换句话说,我可以添加输入字段的行等。所以我的方法是从一个$scope.formData
空对象开始,以封装绑定到静态和动态HTML表单元素的所有属性。 / p>
AngularJS代码如下:
(function() {
var formApp = angular.module("formApp", []);
formApp.controller("FormCtrl", function ($scope, $timeout) {
$scope.formData = {};
$scope.formData.subscribers = [
{ name: null, email: null }
];
$scope.addSubscriber = function() {
$scope.formData.subscribers.push({ name: null, email: null });
};
});
})();
AngularJS表单的HTML:
<body data-ng-app="formApp">
<div data-ng-controller="FormCtrl">
<p>
Name of Topic: <input type="text" data-ng-model="formData.title" placeholder="enter a title" />
</p>
Subscribers:
<button data-ng-click="addSubscriber()">Add subscriber</button>
<table>
<tr>
<th>Name</th>
<th>Email</th>
</tr>
<tr data-ng-repeat="subscriber in formData.subscribers">
<td><input type="text" data-ng-model="subscriber.name" placeholder="enter name" /></td>
<td><input type="text" data-ng-model="subscriber.email" placeholder="enter email" /></td>
</tr>
</table>
<hr style="margin:1em 0;" />
<p>
<em>Debug info</em>: {{ formData }}
</p>
</div>
</body>
注意最后的调试信息部分,它显示$scope.formData
对象及其内容。我对这个表单的实现方式有几个问题。
formData.title
中没有$scope
属性,但由于它绑定到标题输入文本字段,因此当我开始键入值时,{{1} }属性被添加到title
。但是,当我删除输入文本字段中的值时,$scope
属性仍然作为空字符串存在于formData.title
中。我想这没关系,但我真的想在提交表单时清理空值或空值。如果容易这样做,我想在客户端进行,所以服务器端代码不需要清理任何东西。在进一步处理之前,AngularJS是否有任何选项可以检测和清除$scope
中的空/空值,例如$scope
POST?
注意我为此示例设置了jsFiddle。
答案 0 :(得分:4)
只需使用ngModelController $解析器并覆盖默认的HTML输入元素。
通过此实现,您可以始终控制模型值。 因此,在您的情况下,只要视图值为空,就可以将模型设置为null。
var inputDefinition = function () {
return {
restrict: 'E',
require: '?ngModel',
link: function (scope, element, attr, ngModel) {
if (ngModel) {
var convertToModel = function (value) {
return value === '' ? null : value;
};
ngModel.$parsers.push(convertToModel);
}
}
};
/**
* Overwrite default input element.
*/
formApp.directive('input', inputDefinition);
这是更新后的JSFiddle:https://jsfiddle.net/9sjra07q/
答案 1 :(得分:2)
我尝试避免因性能原因而使用观察者。话虽如此,这确实不是一个Angular问题,因为它是一个JavaScript问题。由于您可以完全控制数据何时传递给服务,因此我只需先将其清理干净即可。这很简单,因为您的数据结构很浅。
https://jsfiddle.net/1ua6oj5e/9/
(function() {
var formApp = angular.module("formApp", []);
formApp.controller("FormCtrl", function ($scope, $timeout) {
// Remove junkiness
var _remove = function remove(item) {
if ($scope.formData.title === undefined || $scope.formData.title === '') {
delete $scope.formData.title;
}
};
$scope.formData = {};
$scope.formData.subscribers = [
{ name: null, email: null }
];
$scope.addSubscriber = function() {
$scope.formData.subscribers.push({ name: null, email: null });
};
// Submit to test functionality
$scope.submit = function() {
// Remove title if empty
_remove($scope.formData.title);
/* Remove name and email if empty.
* If your list of fields starts to get large you could always
* just nest another iterator to clean things up.
*/
angular.forEach($scope.formData.subscribers, function(sub) {
_remove(sub.name);
_remove(sub.email);
});
};
});
})();
答案 2 :(得分:2)
function replacer(key, value) {
if (value == "" || value == null) {
return undefined;
}
return value;
}
var foo = {foundation: "", model: {year: 2015, price:null}, week: 45, transport: "car", month: 7};
foo = JSON.stringify(foo, replacer);
foo =JSON.parse(foo);
console.log(foo);
答案 3 :(得分:1)
在formData上添加了Watcher,
$scope.$watch('formData',function(n,o){
if(typeof $scope.formData.title !== 'undefined' && $scope.formData.title === "" ){
delete $scope.formData.title;
}
},true);
更新了小提琴:https://jsfiddle.net/1ua6oj5e/6/
对于所有动态字段,您应该使用角度表单验证,您应该看到:https://docs.angularjs.org/guide/forms