【问题标题】:Detecting non-assignable values in angular directives检测角度指令中不可赋值的值
【发布时间】:2015-06-16 11:50:38
【问题描述】:

我有一个指令,它将根据值获取/设置元素的焦点。

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

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

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

我明白它为什么会抛出错误,但是我如何才能从指令内部检测到不可赋值的值,然后阻止它附加在焦点更改时尝试分配值的焦点/模糊事件? em>


这是一个使用不可赋值的指令的示例。在这种情况下,如果它也是一个空白值,它会将焦点设置在转发器中的最后一项上

<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
    };
}]);

【问题讨论】:

    标签: angularjs angularjs-directive


    【解决方案1】:

    更新

    检测这一点(而不是多一个属性)的编程方法是使用$parse fn。这就是角度检查和抛出错误的方式。它尝试解析双向绑定属性,如果它没有分配属性,则会引发错误。 ($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/

    【讨论】:

    • 我正在考虑这一点,除非有一种程序化的方式来检测不可赋值的值,否则我肯定会这样做。也许我可以尝试在 try/catch 中分配值,它会引发我知道的错误?不过,这似乎很老套。
    • 看起来检测事物的编程方式是使用 $parse fn。这就是角度检查和抛出错误的方式。它尝试解析属性,如果它没有分配属性,则会引发错误。 ($parse($attrs['focusWhen']).assign)。更新小提琴jsfiddle.net/cw7fftfx
    • 啊是的,就是这样!谢谢!如果您将此作为答案发布,我会将其标记为正确。
    猜你喜欢
    • 2011-11-30
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2016-07-15
    • 2021-01-27
    相关资源
    最近更新 更多