如何将变量从 $scope 传递到指令中并反转?

Posted

技术标签:

【中文标题】如何将变量从 $scope 传递到指令中并反转?【英文标题】:How to pass a variable from $scope into a directive, and reverse? 【发布时间】:2015-11-27 07:34:29 【问题描述】:

我目前正在尝试实现一个应该使一些 DOM 元素闪烁的指令。为此,我使用$timeout 将元素的可见性设置为可见或隐藏。我的问题是,如果在$timeout 调用中我硬编码一个值(比如'500'),一切运行顺利。但是如果我尝试通过一个变量来传递这个参数,我会得到一个非常快的元素闪烁,好像没有输入任何参数(默认值是'0')。

HTML

<button class="btn btn-key"><span class="blink" blinkSpeed='500'>Q</span></button>
displayBlinkSpeed

JS

.directive('blink',function($timeout)
return
    restrict:'ACE',
    transclude: true,
    scope:
        blinkSpeed: '='
    ,
    link: function(scope,element,attrs)
        function showElement()             
            var speed = parseInt(scope.blinkSpeed);
            element.css("visibility","visible");
            $timeout(hideElement,speed);
            scope.displayBlinkSpeed = speed;
        

        function hideElement()
            var speed = parseInt(scope.blinkSpeed);
            element.css("visibility","hidden");
            $timeout(showElement,speed);
            scope.displayBlinkSpeed = speed;
        

        showElement();
    ,
    template: '<span ng-transclude></span>',
    replace: true
    ;
);

另外,我忘了提到 html 中的 displayBlinkSpeed 也没有显示任何内容。 我的猜测是我的指令无法与 DOM 通信(接收/发送)信息。不幸的是,我还没有找到让它工作的方法。我错过/误解了什么吗?

【问题讨论】:

【参考方案1】:

首先,displayBlinkSpeed 不会显示任何内容,因为 displayBlinkSpeed 仅在指令的隔离范围内定义 - 它位于指令之外的 undefined

至于blinkSpeed - 当你绑定到一个属性时,Angular 会规范化属性名,所以scope: blinkSpeed: "=" 绑定到blink-speed="500" 属性(不是blinkSpeed="500" 属性)。没有它,$scope.blinkSpeed === undefinedparseInt(undefined) === NaN,会导致闪烁。

将 HTML 更改为:

<span class="blink" blink-speed='500'>Q</span>

有点跑题:

1:您不需要执行parseInt(scope.blinkSpeed),因为"=" 会正确解析为整数。因此,以下方法也可以:

$timeout(hideElement, $scope.blinkSpeed);

2: 因为您不打算在指令中修改闪烁速度,所以使用 "=" 进行双向绑定是浪费 - 而是使用单向绑定到表达式"&amp;":

scope: 
  blinkSpeed: "&",
,
link: function(scope)
  var speed = scope.blinkSpeed();
  $timeout(hideElement, speed);

【讨论】:

以上是关于如何将变量从 $scope 传递到指令中并反转?的主要内容,如果未能解决你的问题,请参考以下文章

将范围变量从控制器绑定到指令而不使用$ watch

如何将指令的范围值作为$ scope传递给控制器

如何将 AngularJS 变量值传递给 C# 控制器?

将数据数组从控制器传递到自定义指令?

AngularJS:将函数从控制器传递到指令的多种方法

将 AngularJS 范围变量从指令传递到控制器的最简单方法?