检测角度指令

时间:2015-06-16 11:50:39

标签: angularjs angularjs-directive

我有一个指令,它将根据值获得/设置一个元素。

当元素聚焦或模糊时,指令将更新布尔值。但是,有时我只想在满足条件时设置焦点并使用不可赋值的值,这会引发此错误:

Error: [$compile:nonassign] Expression '$last && !domain.url' used with directive 'focusWhen' is non-assignable!

WORKING DEMO HERE(检查控制台是否有错误)

我理解为什么它会抛出一个错误,但如何从指令内部检测不可赋值,然后阻止它附加焦点/模糊事件,这些事件试图在焦点改变时分配值?

以下是使用不可赋值的指令的示例用法。在这种情况下,如果它也是一个空值

,它会将焦点设置在转发器中的最后一个项目上
<div ng-repeat="domain in domainList">
  <input type="text" ng-model="domain.url" focus-when="$last && !domain.url"/>
</div>

这是指令代码;

testApp.directive("focusWhen", ["$timeout", function ($timeout) {

    function getLink($scope, $element) {
        $scope.$watch("focusWhen", function (val) {
            //only focus when needed and when this element doesn't already have focus
            if (val && $element[0] !== document.activeElement) {
                //Small delay needed before we can get focus properly
                $timeout(function () {
                    $element.focus();
                });
            }
        });
        $element.on("blur.focusWhen", function () {
            if ($scope.focusWhen) {
                $timeout(function () {
                    $scope.focusWhen = false;
                });
            }
        });
        $element.on("focus.focusWhen", function () {
            if (!$scope.focusWhen) {
                $timeout(function () {
                    $scope.focusWhen = true;
                });
            }
        });
    }

    return {
        restrict: "A",
        scope: {
            focusWhen: "="
        },
        link: getLink
    };
}]);

1 个答案:

答案 0 :(得分:1)

<强>更新

检测此方法的程序化方法(而不是另外一个属性)使用$parse fn。这是检查和抛出错误的角度。它尝试解析双向绑定属性,如果它没有assign属性,则抛出错误。 ($parse($attrs['focusWhen']).assign)

http://jsfiddle.net/cw7fftfx/

旧答案:

如何再次指示是否要设置焦点值?

<input type="text" ng-model="domain.url" one-way="true" focus-when="$last && !domain.url"/>

    $element.on("blur.focusWhen", function () {
        if ($scope.focusWhen) {
            $timeout(function () {
                if (!$attr.oneWay) {
                $scope.focusWhen = false;
                }
            });
        }
    });

http://jsfiddle.net/j1v6jk8k/3/