【问题标题】:$watch does not watch model when using scope attribute$watch 使用范围属性时不监视模型
【发布时间】:2015-09-27 13:50:57
【问题描述】:

我正在为<input> 制定一个指令,用于监视用户键入的内容。当用户输入一个有效的电话号码时,它应该重新格式化输入模型对象并将一个变量设置为 true,向父作用域表明该模型现在包含一个有效的电话号码。

CountryISO 是作为常量注入的依赖,并且包含 - 惊喜 - 用户的国家代码。指令中使用的函数来自 phoneformat.js

更新: 现在valid = true/false 分配有效。但是我该如何更新实际的模型值呢?这需要更改为格式正确的电话号码。

app.directive('phoneFormat', ['CountryISO', function (CountryISO) {
            return {
                restrict: 'A',
                require: 'ngModel',
                scope: {
                    valid:'='
                },
                link: function (scope, element, attrs, ngModel) {

                scope.$watch(function() {
                return ngModel.$viewValue; //will return updated ng-model value
                }, function(v) {

                if (isValidNumber(v, CountryISO)) {

                    // What do I do here? This doesn't work.
                    v = formatE164(CountryISO, v);
                    // This neither
                    ngModel.$viewValue = formatE164(CountryISO, v);

                    console.log("valid");
                    scope.valid = true;

                } else {

                    console.log("invalid");
                    scope.valid = false;
                }
                });
                }
            };
        }]);

作为指令

html 看起来像:

<input data-phone-format data-valid="user.validPhoneNumber" data-ng-model="user.info.ph">

问题是,一旦我将scope: {valid:'='}, 作为指令的一部分,$watch 就会停止工作。我如何获得两者?我希望指令能够指向父范围内的变量,该变量应根据电话号码的有效性从 true 变为 false。

【问题讨论】:

    标签: angularjs angularjs-directive


    【解决方案1】:

    因为当您声明 watcher 时,变量正在使用指令范围进行解析,在您添加 scope: {valid:'='} 以使其正常工作后,该指令范围成为隔离范围,您可以将 watch 放在 ngModel.$viewValue

    要更新ngModel 值,您可以使用ngModel$setViewValue 方法设置ngModel 的$viewValue,然后更新$modelValue 中的值,您需要在ngModel 上执行$render()

    继续阅读$viewValue & $modelValue

    链接

    link: function(scope, element, attrs, ngModel) {
    
        scope.$watch(function() {
            return ngModel.$viewValue; //will return updated ng-model value
        }, function(v) {
    
            if (isValidNumber(v, CountryISO)) {
    
                // What do I do here? This doesn't work.
                v = formatE164(CountryISO, v);
                // This neither
                ngModel.$setViewValue(formatE164(CountryISO, v));
                ngModel.$render(); //to updated the $modelValue of ngModel
                console.log("valid");
                scope.valid = true;
    
            } else {
    
                console.log("invalid");
                scope.valid = false;
            }
        });
    }
    

    【讨论】:

    • $viewValue 来自哪里?这是我必须在某处声明的东西吗?
    • @nickdnk 它来自require,您需要在链接函数参数中添加该参数..查看更新后的答案..
    • $viewValue 是 ngModelController 上的一个属性,你 require-d。
    • 好的。凉爽的。有用。这是否意味着我不需要 element 和 attr 作为参数?
    • @nickdnk 很高兴为您提供帮助..谢谢 :) 您可以阅读链接答案以了解更多关于 $viewValue$modelValue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多