javascript - 使用 ng-maxlength 时不会触发 $watch 监听器

标签 javascript angularjs angularjs-directive angularjs-validation

我有一个基本上监视元素值的指令。

此元素的 ng-maxlength 属性设置为 150。当我传递 150 个字符时,$watch 不再触发。此外,当我使用 ctrl + x 删除整个文本时,$watch 再次不会被触发。

输入元素

<input type="text" ng-model="company.fullName" name="companyFullName" required ng-maxlength="150" ng-input-validate />

指令

enlabApp.directive('ngInputValidate', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ctrl) {
            scope.$watch(function () { return ctrl.$modelValue; }, function (value) {
                 console.log('test');
            });
        }
    };
});

当我删除 ng-maxlength 指令时,问题就消失了。

最佳答案

您正在使用ng-maxlength=150,这意味着 Angular 将对字符数执行验证,并相应地更新$modelValue。这意味着当它无效时(如果长度超过)$modelValue将是undefined,然后您通过执行ctl-x删除该值,然后消化循环运行,模型值再次变为未定义,因为不存在任何值,并且与之前的值没有区别,并且观察器不会触发(仅当modelValue时观察器才会触发> 变脏)。

所以使用 $viewValueelement[0].value (我不建议)。这样做:-

        scope.$watch(function () { 
          return ctrl.$viewValue; 
        }, function (value) {
          console.log('Triggered');
        });
  • $viewValue: View 中的实际字符串值。
  • $modelValue:模型中与控件绑定(bind)的值。

请记住,如果您想限制 minlength 属性,使用 ng-minlength 仅用于验证,它不会限制用户输入/粘贴更多字符这是要走的路

另请注意,您不必在 ngModel 上注册 watch ,您可以使用 $viewChangeListeners也无需创建额外的 watch 。

Array of functions to execute whenever the view value has changed. It is called with no arguments, and its return value is ignored. This can be used in place of additional $watches against the model value.

ctrl.$viewChangeListeners.push(function(){//... });

关于javascript - 使用 ng-maxlength 时不会触发 $watch 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431442/

相关文章:

javascript - 如何从 CSSStyleDeclaration 对象获取真正的 css 属性名称?

javascript - Protractor - 当网格的行列 ID 为 ="0-0"时,如何从一列中获取所有单元格并对它们求和

javascript - 提供 Json AngularJS 的服务

javascript - 表格内带有自定义元素的 AngularJS ng-repeat 渲染异常

javascript - 如何防止 ASP.net PageMethod 调用阻止其他 javascript 函数调用

javascript - 如何在 React 中测试从子组件提升到父组件的状态?

javascript - 从过滤的对象中获取 Firebase 唯一 ID

python - 无法在我的 index.html 文件中调用服务; Django 错误

Angularjs 路由 : TypeError: Cannot read property 'path' of undefined

javascript - 在指令中将元素向上移动到窗口滚动然后应用固定位置