Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ngShow超时未按预期工作_Javascript_Angularjs_Timeout - Fatal编程技术网

Javascript ngShow超时未按预期工作

Javascript ngShow超时未按预期工作,javascript,angularjs,timeout,Javascript,Angularjs,Timeout,我正在努力研究如何使ngShow在指定的超时时间内确定表达式,结果表明Angular可以计算表达式,但无法反映视图中的更改,下面是我使用的代码 (视图) Angular可以确定结果(真或假),但视图似乎没有反映更改 任何帮助都将不胜感激,谢谢 不要让showApplyBtns返回一个值,而是尝试将一个值赋给一个作用域变量 然后您的按钮可以将该值绑定到ng show <button type="button" class="btn btn-primary rule-fad

我正在努力研究如何使ngShow在指定的超时时间内确定表达式,结果表明Angular可以计算表达式,但无法反映视图中的更改,下面是我使用的代码

(视图)

Angular可以确定结果(真或假),但视图似乎没有反映更改


任何帮助都将不胜感激,谢谢

不要让
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)
};