如何将变量从 $scope 传递到指令中,然后反向传递?
How to pass a variable from $scope into a directive, and reverse?
我目前正在尝试执行一个指令,该指令应该使某些 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}}
也没有显示任何内容。
我的猜测是我的指令无法将 (receive/send) 信息传递给 DOM。不幸的是,我还没有找到让它工作的方法。我有 missed/misunderstood 东西吗?
首先,{{displayBlinkSpeed}}
不会显示任何内容,因为 displayBlinkSpeed
仅在指令的隔离范围内定义 - undefined
在它之外。
至于 blinkSpeed
- 当您绑定到属性时,Angular 规范化属性名称,因此 scope: {blinkSpeed: "="}
绑定到 blink-speed="500"
属性(不是 blinkSpeed="500"
属性)。没有它,$scope.blinkSpeed === undefined
和parseInt(undefined) === NaN
会导致闪烁。
将 HTML 更改为:
<span class="blink" blink-speed='500'>Q</span>
有点跑题:
1: 您不需要执行 parseInt(scope.blinkSpeed)
因为 "="
会正确解析为整数。因此,以下内容同样有效:
$timeout(hideElement, $scope.blinkSpeed);
2: 由于您不打算在指令中修改闪烁速度,因此使用 "="
进行双向绑定是一种浪费 - 而不是使用使用 "&"
:
单向绑定到表达式
scope: {
blinkSpeed: "&",
},
link: function(scope){
var speed = scope.blinkSpeed();
$timeout(hideElement, speed);
}
我目前正在尝试执行一个指令,该指令应该使某些 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}}
也没有显示任何内容。
我的猜测是我的指令无法将 (receive/send) 信息传递给 DOM。不幸的是,我还没有找到让它工作的方法。我有 missed/misunderstood 东西吗?
首先,{{displayBlinkSpeed}}
不会显示任何内容,因为 displayBlinkSpeed
仅在指令的隔离范围内定义 - undefined
在它之外。
至于 blinkSpeed
- 当您绑定到属性时,Angular 规范化属性名称,因此 scope: {blinkSpeed: "="}
绑定到 blink-speed="500"
属性(不是 blinkSpeed="500"
属性)。没有它,$scope.blinkSpeed === undefined
和parseInt(undefined) === NaN
会导致闪烁。
将 HTML 更改为:
<span class="blink" blink-speed='500'>Q</span>
有点跑题:
1: 您不需要执行 parseInt(scope.blinkSpeed)
因为 "="
会正确解析为整数。因此,以下内容同样有效:
$timeout(hideElement, $scope.blinkSpeed);
2: 由于您不打算在指令中修改闪烁速度,因此使用 "="
进行双向绑定是一种浪费 - 而不是使用使用 "&"
:
scope: {
blinkSpeed: "&",
},
link: function(scope){
var speed = scope.blinkSpeed();
$timeout(hideElement, speed);
}