Forms AngularJS-直接在<;表格>;要素
在AngularJS中,是否有任何方法可以直接在Forms AngularJS-直接在<;表格>;要素,forms,angularjs,angular-ngmodel,Forms,Angularjs,Angular Ngmodel,在AngularJS中,是否有任何方法可以直接在元素上声明ng模型,而不必在该表单的每个控件/输入上声明ng模型,然后通过其名称访问控制器中控件的值 具体来说,如果你有这样的表格 <form> <input type="text" name="email"> <input type="text" name="age"> </form> <form> <input type="text" ng-model="user.
元素上声明ng模型,而不必在该表单的每个控件/输入上声明ng模型,然后通过其名称访问控制器中控件的值
具体来说,如果你有这样的表格
<form>
<input type="text" name="email">
<input type="text" name="age">
</form>
<form>
<input type="text" ng-model="user.email">
<input type="text" ng-model="user.age">
<form>
我想这样做:
<form ng-model="user">
<input type="text" name="email">
<input type="text" name="age">
</form>
我问这个问题的原因是,我正在对一个现有的web项目进行角度化,其中一些表单很容易有20或30个控件,并且单独定义ng模型似乎有些过分
我能找到的所有表单示例都在各个控件上声明ng模型。我还能够挖掘出这一点,基本上说,像这样的事情将需要一个重大的AngularJS大修,所以我怀疑这可能是不可能的。但是这张票是一年前的,也许从那以后情况已经改变了 有一个名为的自定义指令克服了这个问题。它使表单中的每个模型自动绑定到表单的ng模型 例如:
<form jfb-form-model="user">
<input name="email" />
<input name="age" />
</form>
将转到
<form jfb-form-model="user">
<input name="email" ng-model="user.email"/>
<input name="age" ng-model="user.age/>
</form>
开箱即用;不需要。但是您可以很容易地编写自己的指令来实现这一点
app.directive('lazyFormModel', function() {
return {
require: ['form'],
compile: function compile(tElement, tAttrs) {
var modelName = tAttrs.lazyFormModel;
angular.forEach(tElement.find('input'), function(e) {
var $e = angular.element(e);
var name = $e.attr('name');
$e.attr('ng-model', modelName + '.' + name);
});
}
};
});
上面将创建一个指令,该指令将循环遍历所有包含输入的元素,并基于名称值在其上标记ng model属性。将其附加到表单元素,您就可以开始了:
<form lazy-form-model="user">
<input type="text" name="email">
<input type="text" name="age">
</form>
更新了。这太好了,谢谢!我选择这个作为答案,因为jackypan1989答案中的角度模型的工作原理非常相似。您知道我如何扩展此功能以使用多个名称相同但值不同的复选框(输入的检查表类型)?更新了处理复选框的答案有一种通过ng repeat
s使用动态输入的方法吗?@Ryeball有可能,但是您需要在ng repeat
触发后触发的东西,AFAIK需要一些设置。如果你想的话,看看这个。
app.directive('lazyFormModel', function() {
return {
require: ['form'],
compile: function compile(tElement, tAttrs) {
var modelName = tAttrs.lazyFormModel;
angular.forEach(tElement.find('input'), function(e) {
var $e = angular.element(e);
var name = $e.attr('name');
$e.attr('ng-model', modelName + '.' + name);
});
}
};
});
<form lazy-form-model="user">
<input type="text" name="email">
<input type="text" name="age">
</form>
angular.forEach(tElement.find('input'), function(e) {
var $e = angular.element(e);
var name = $e.attr('name');
var modelProperty = modelName + '.' + name;
if($e.attr('type') == 'checkbox') {
modelProperty += '.' + $e.attr('value');
}
$e.attr('ng-model', modelProperty);
});