【发布时间】:2015-04-16 19:54:18
【问题描述】:
我有一个构建字符串的复杂控件(按钮单击、下拉菜单等)。因此,每个按钮单击/下拉选择都会调用一个作用域函数,该函数又会更新一个保存我的结果的作用域变量。
我将此范围变量绑定到 UI 中的隐藏字段:
<input type="hidden" ng-model="MyComplexString" custom-validation ng-value="MyComplexString" />
但是,当控制器函数更新MyComplexString 时,custom-validation 不会被触发。
我尝试将输入类型更改为文本,确实MyComplexString 得到了更新,但是,custom-validation 仍然没有触发。
如果我在文本框中输入,custom-validation 会按预期触发。
研究表明,AngularJs 会侦听在 DOM 元素上触发的 input 事件,但在更改范围变量后,控制器函数不会在绑定到范围变量的输入上触发这些事件。所以我需要手动完成。
我希望这是有道理的。任何想法将不胜感激。
EDIT = 添加验证指令的实现(实现只检查某些内容是否以“逗号”开头。
.directive("customValidation", function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, ele, attrs, ctrl) {
ctrl.$parsers.unshift(function(value) {
var valid = false;
if (value) {
// test and set the validity after update.
valid = value.charAt(0) == ',';
ctrl.$setValidity('customValFlag', valid);
}
return valid ? value : undefined;
});
}
};
})
【问题讨论】:
-
我的第一直觉是想知道您是否可以使用
$watch并在那里进行验证而不是绑定到隐藏字段?如果你能提供你的custom-validation指令,可以帮助 -
我将指令添加到主要问题中。我不介意尝试像你说的那样;而且我知道我可以通过在那里设置一个标志来驱动我的控制器中的验证,这感觉就像是错误的方式。另外,它不可重复使用,如果我需要在不同的字段上进行相同的验证。
标签: javascript angularjs input dom-events