我正在努力使ngShow在指定的超时时间内确定表达式,事实证明Angular可以评估表达式但无法反映视图中的更改,这是我使用的代码
(视图)
<button
type="button"
class="btn btn-primary rule-fade"
tooltip="{{ proLang.tooltip.ruleApplyBtnTxt }}"
ng-click="applyRule('basic')"
ng-show="showApplyBtns(selectedRules, selectedObj)"
>
<span class="glyphicon glyphicon-dashboard"></span>
Apply Rules
</button>
(控制器)
以及执行showApplyBtn函数的控制器
//determine whether apply buttons should be shown
$scope.showApplyBtns = function(selectedRules, selectedObj) {
$timeout(function() {
return selectedRules.length == 1 && selectedObj.length == 1;
},500);
};
Angular可以确定结果(对或错),但该视图似乎无法反映所做的更改。
任何帮助,将不胜感激,谢谢!
最佳答案
而不是让showApplyBtns
返回值,请尝试将值分配给作用域变量。
然后,您的button
可以将该值绑定到ng-show
<button
type="button"
class="btn btn-primary rule-fade"
tooltip="{{ proLang.tooltip.ruleApplyBtnTxt }}"
ng-click="applyRule('basic')"
ng-show="showApplyBtns"
>
然后更改您的控制器,以便
applyRule()
调用updateShowAppyBtns
,这将更新绑定变量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);
};
现在,当调用
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
返回值,因此除了利用状态的持久性来管理更新(如上面的答案所示)外,别无他法。希望有帮助。 :)