2015-07-06 40 views
1

我在如何使ngShow在指定的超時時間內確定表達式掙扎,事實證明,Angular可以評估表達式,但無法反映視圖中的更改,這裏是代碼我用ngShow的超時不能按預期工作

(查看)

<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可以確定結果(true或false),但似乎視圖不反映更改。

任何幫助將不勝感激,謝謝!

回答

2

而不是讓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在返回自己的值之前返回一個值,除了利用狀態的持久性來管理更新(如上面的答案所示)之外,沒有什麼可做的了。

希望有幫助。 :)

+0

感謝您的幫助,現在正常工作,謝謝!但我想知道爲什麼我的方法不起作用,因爲它基本上遵循相同的規範,我的目的是延遲評估我的表達式,輸出最終是一個布爾值,爲什麼我的方法不適用? – user2499325

+1

嗨@ user2499325 - 我剛剛更新了我的答案,並解釋了爲什麼您以前的代碼沒有按預期工作。 – sfletche

+0

感謝您的澄清,我認爲我的理念在閱讀解釋後更加清晰,非常感謝!我的尊敬! – user2499325