AngularJS:观察由变量和函数组成的表达式

时间:2014-07-31 16:51:56

标签: javascript angularjs angularjs-directive directive watch

大家好!提前谢谢!

我有以下问题:我想看一个输入字段的属性,同时是我的指令的名称,以便在需要时关注并选择值 a)输入字段所在的区域被激活或何时被激活 b)发生服务器错误。

这里是输入字段的代码:

<input type="email"
    data-focus-and-select="areas.contactInformationEditEmail || hasServerErrorsEmail()" />

这里是控制器功能的代码:

$scope.hasServerErrorsEmail = function() {
    return !!($scope.notifications.errors.email.empty ||
            $scope.notifications.errors.email.invalid ||
            $scope.notifications.errors.email.illegal ||
            $scope.notifications.errors.email.blacklisted ||
            $scope.notifications.errors.email.conflict);
};

如果发生服务器错误,则其中一个通知错误设置为true 这里是指令的代码:

angular.module('myApp.directive').directive('focusAndSelect', function() {
    'use strict';
    return {
        scope: { focusAndSelect: '=' },
        link: function(scope, element) {
            scope.$watch('focusAndSelect', function(newValue) {
                if (newValue && !element.hasClass('ng-hide')) {
                    element[0].focus();
                    element[0].setSelectionRange(0, element[0].value.length);
                }
            });
        }
    };
});

有三种情况:

1)&#34;焦点并选择&#34;当我将表单更改为可编辑模式时,areas.contactInformationEditEmail设置为true。 2)&#34;焦点和选择&#34;当我收到服务器错误时,它不会工作。输入字段未被聚焦和选择。 3)但是当我从表达式areas.contactInformationEditEmail中删除areas.contactInformationEditEmail || hasServerErrorsEmail()时,&#34;焦点并选择&#34;适用于接收输入字段的错误。

我不知道。是否可能会立即观察和变量以及函数调用?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

当你使用&#39; =&#39;在指令的隔离范围内,它绑定到父范围中的属性,它不可能绑定到计算表达式。

试试这个:

<input type="email"
    data-focus-and-select="{{areas.contactInformationEditEmail || hasServerErrorsEmail()}}" />

和你的指令:

angular.module('myApp.directive').directive('focusAndSelect', function() {
    'use strict';
    return {
        scope: { focusAndSelect: '=' },
        link: function(scope, element) {
            scope.$watch('focusAndSelect', function(newValue) {
                if (newValue && !element.hasClass('ng-hide') && scope.$eval(newValue)) {
                    element[0].focus();
                    element[0].setSelectionRange(0, element[0].value.length);
                }
            });
        }
    };
});

你需要$ eval,因为这个值是一个String,你想得到它的布尔值。

这里有一个简化的jsfiddle来演示它。