Javascript ngShow超时未按预期工作
我正在努力研究如何使ngShow在指定的超时时间内确定表达式,结果表明Angular可以计算表达式,但无法反映视图中的更改,下面是我使用的代码 (视图) Angular可以确定结果(真或假),但视图似乎没有反映更改Javascript ngShow超时未按预期工作,javascript,angularjs,timeout,Javascript,Angularjs,Timeout,我正在努力研究如何使ngShow在指定的超时时间内确定表达式,结果表明Angular可以计算表达式,但无法反映视图中的更改,下面是我使用的代码 (视图) Angular可以确定结果(真或假),但视图似乎没有反映更改 任何帮助都将不胜感激,谢谢 不要让showApplyBtns返回一个值,而是尝试将一个值赋给一个作用域变量 然后您的按钮可以将该值绑定到ng show <button type="button" class="btn btn-primary rule-fad
任何帮助都将不胜感激,谢谢 不要让
showApplyBtns
返回一个值,而是尝试将一个值赋给一个作用域变量
然后您的按钮可以将该值绑定到ng show
<button
type="button"
class="btn btn-primary rule-fade"
tooltip="{{ proLang.tooltip.ruleApplyBtnTxt }}"
ng-click="applyRule('basic')"
ng-show="showApplyBtns"
>
现在,当调用updateShowApplyBtns
时,$timeout
函数将更新$scope.showApplyBtns
,由于更新后的值现在绑定到按钮上的ng show
,因此按钮的可见性将被更新
解释
您遇到的问题是showApplyBtns
实际上没有返回值
$scope.showApplyBtns = function(selectedRules, selectedObj){
$timeout(function(){
return selectedRules.length == 1 && selectedObj.length == 1;
},500);
// return undefined (this is what actually happens here)
};
传递给$timeout
的匿名函数返回一个值…但是该值被$timeout
函数吞没,并且showApplyBtns
没有返回任何内容,因此它返回默认值undefined
您可以想象,showApplyBtns
在返回自己的值之前等待$timeout
完成是不合适的,因为这会阻止i/o(它会在等待时停止所有执行,这在javascript中是设计上很难做到的)
由于showApplyBtns
不能等到$timeout
返回一个值后再返回它自己的值,因此除了利用状态的持久性来管理更新之外,没有什么可做的了(如我上面的回答所示)
希望这能有所帮助。:) 谢谢你的帮助,现在可以用了,谢谢!但我想知道为什么我的方法不起作用,因为它基本上遵循相同的规范,我的目的是延迟表达式的计算,最终输出是一个布尔值,为什么我的方法不适用?Hey@user2499325-我刚刚更新了我的答案,解释了为什么您以前的代码没有按预期工作。我感谢您的澄清,我认为我的概念在阅读解释后更清晰了,非常感谢!我的尊敬!
<button
type="button"
class="btn btn-primary rule-fade"
tooltip="{{ proLang.tooltip.ruleApplyBtnTxt }}"
ng-click="applyRule('basic')"
ng-show="showApplyBtns"
>
$scope.applyRule(...) {
...
$scope.updateShowApplyBtns();
}
//determine whether apply buttons should be shown
$scope.updateShowApplyBtns = function() {
$timeout(function() {
$scope.showApplyBtns = $scope.selectedRules.length == 1 && $scope.selectedObj.length == 1;
},500);
};
$scope.showApplyBtns = function(selectedRules, selectedObj){
$timeout(function(){
return selectedRules.length == 1 && selectedObj.length == 1;
},500);
// return undefined (this is what actually happens here)
};