【发布时间】:2014-08-26 13:03:42
【问题描述】:
我最近一直致力于动态更改表单上输入字段的约束。目的是制作一个后端驱动的表单,而所有字段及其约束都由服务器发送给我们。虽然我设法通过创建一个简单的指令来随意添加/删除约束,但似乎表单控制器没有接收这些更改,因此表单始终为 $valid。看看this jsfiddle,这里是指令:
myApp.directive('uiConstraints', [function(){
function applyConstraints(element, newVal, oldVal){
//remove old constraints
if(oldVal !== undefined && oldVal !== null){
for (var i = 0; i < oldVal.length; i++) {
element.removeAttr(oldVal[i].key);
}
}
//apply new constraints
if(newVal !== undefined && newVal !== null){
for (var i = 0; i < newVal.length; i++) {
var constraint = newVal[i];
element.attr(constraint.key, constraint.value);
}
}
}
function link(scope, element, attrs){
scope.$watch(attrs.uiConstraints, function(newVal, oldVal){
applyConstraints(element, newVal, oldVal);
});
}
return {
restrict : 'A',
link : link
};
}]);
所需的行为是这样的,就像在official angularjs plunker 上一样。但是,似乎在指令填充输入字段上的约束之前创建了 FormController,并且更新这些约束不会更新 FormController 中的相应值。
是否有人知道我是否可以强制 FormController 拾取指令对约束所做的更改?如果是这样,怎么办?我什至不知道从哪里开始......谢谢。
-- 编辑--
我无法让 plunker 工作(向其他人展示我的最新更改)所以这是我所拥有的 jsfiddle:latest
要更详细地描述该问题:
- 转到描述的 jsfiddle
- 如果您从文本框中删除初始值,它将变为红色(无效),但控制器不会拾取该值并仍会显示:
myform.$valid = true
myform.myfield.$valid = true
-- 编辑--
赏金说明无法识别 Stack Overflow 格式(例如 2 个空格用于换行等),因此这里的格式更易读:
由于这仍然是一个未解决且有趣的问题,我决定开始赏金。
要求是:
- 适用于古老的 AngularJS(1.0.3) 和更新版本(如果不能在 1.0.3 上完成,但有人在较新版本的 Angular 上完成,我将奖励赏金)
- 最初,一个字段对其没有限制(不是必需的,未设置最大值和最小值等)
- 在任何时候,该字段的约束都可以改变(它可能成为必需的,或者设置了值的模式等),并且可以删除任何现有的约束
- 所有约束都存储在对象或数组的控制器中
- FormController 获取更改,以便在约束时适当更改任何 $scope.FormName.$valid 在该表单中的任何字段上更改我的 jsfiddle 是一个很好的起点。
感谢您的宝贵时间,祝您好运!
【问题讨论】:
-
我花了一些时间研究这个问题,因为这是一个非常有趣的问题。基本问题是
<input>元素需要用它的新属性重新编译。使用 $compile 服务来执行此操作。我有一个半工作的笨蛋,但它没有完全发挥作用,所以我没有把它作为答案。 plnkr.co/edit/WlSyZQ6hPGA9B4oWRG43?p=preview
标签: angularjs angularjs-directive angularjs-controller