【问题标题】:How to trigger 'change' on a hidden field bound to a scope variable with AngularJs without JQuery?如何在没有 JQuery 的情况下使用 AngularJs 在绑定到范围变量的隐藏字段上触发“更改”?
【发布时间】: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


【解决方案1】:

你可以做的就是在你的指令中使用$watch,这样它就可以重用了。看答案here

本质上,在您的链接功能中,您可以$watchattrs.ngModel,它会捕获任何更改。你的 link 函数会变成这样:

link: function (scope, element, attrs) {
            scope.$watch(attrs.ngModel, function (newVal) {
                //Do custom validation here
            });
        }

查看工作中的 JSFiddle 我用两个简单的输入和一个隐藏的输入分叉了 here,该指令使用将每个更改写入控制台的指令

编辑:您可能需要检查 newVal 和 oldVal 是否相等以忽略初始化调用,如下所示:

link: function (scope, element, attrs) {
        scope.$watch(attrs.ngModel, function (newVal, oldVal) {
            if(newVal !== oldVal) {
                //Do custom validation here
            }
        });
    }

【讨论】:

  • 谢谢!我仍然在链接函数中传递控件,因为我需要设置它的有效性,但是你在这里所拥有的正是我需要继续前进的。
猜你喜欢
  • 2021-04-25
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2014-06-22
  • 1970-01-01
相关资源
最近更新 更多