2016-09-30 47 views
1

也許只是一個基本的誤解,但是我對Angular和ng顯示有一個小問題。根據功能而定的角度顯示

我有一個簡單的形式與三個輸入字段。我想用信息文本顯示一個div,但只有在設置了所有三個輸入字段的情況下。

我控制器(帶controllerAs語法,別名爲 'myControllerCtrl')看起來像這樣:

var vm = this; 

vm.annualConsumption = null; 
vm.calorificVal = null; 
vm.zNumber = null; 
vm.checkIfAllValuesAreSet = checkIfAllValuesAreSet; 


function checkIfAllValuesAreSet() { 
    return vm.annualConsumption && vm.calorificVal && vm.zNumber; 
} 

所以我在DIV把一個

ng-show="myControllerCtrl.checkIfAllValuesAreSet()" 

。但是如果我設置所有輸入字段,它不會顯示div!如果我把該功能的條件直接放入ng顯示中,如

ng-show="vm.annualConsumption && vm.calorificVal && vm.zNumber" 

它的工作原理。所以我的問題是:爲什麼我不能使用函數作爲ng-show的表達式?

+0

嘗試'NG秀=「checkIfAllValuesAreSet()」'作爲控制器已經有範圍,該功能附加到'$ scope' – Pankaj

+0

嘗試只NG-秀=「checkIfAllValuesAreSet()」 –

+0

如果你糾正它會工作到ng-show =「vm.checkIfAllValuesAreSet()」你的別名是'vm'而不是'myControllerCtrl'那就是爲什麼第二個條件工作... –

回答

1

當控制器/模板加載時,您的ng-show="myControllerCtrl.checkIfAllValuesAreSet()"只會運行一次。所以如果你改變你的表單上的任何東西,沒有什麼可以再次觸發該功能。

你可以簡單地改變你的NG-顯示爲:

ng-show="vm.annualConsumption && vm.calorificVal && vm.zNumber" 

這將立即更新,如果這些變化。

+0

是啊,這就是我自己想出來的,並在我的問題中告訴過你,我只是好奇它爲什麼不能使用這個函數。但我想這個問題就像你說的那樣,這個函數只會被調用,而不是像三個值direclty的綁定......謝謝!我認爲這是迄今爲止我的問題的唯一正確答案。 – Vortilion

0

可以使用函數作爲表達式,但要確保函數返回boolean。 試試這個:

function checkIfAllValuesAreSet() { 
if(vm.annualConsumption !=null && vm.calorificVal !=null && vm.zNumber !=null){ 
return true; 
} 
+0

這沒有必要。看看:https://api.jquery.com/Types/(這不是關於jQuery,它是關於JavaScript) –

+0

將看看它。謝謝:) – MSH

2

您沒有使用$scope。附加功能控制器的範圍,你是好去:

$scope.checkIfAllValuesAreSet = function() { 
    return vm.annualConsumption && vm.calorificVal && vm.zNumber; 
} 

所以在你的HTML你就能夠做到:

ng-show="checkIfAllValuesAreSet()" 

記住,$scope是一個非常重要的概念的angularjs。試圖避免使用它,這是一個不好的想法。 您可以閱讀關於$ scope here的文檔。

+0

對不起,但在這一點上,我不得不不同意......使用全局$範圍不是一個好習慣,而是應該像我一樣使用自己的範圍,「var vm = this;」每個AngularJS開發者都在告訴你這個..否則你會得到很多範圍錯誤...... – Vortilion

+0

$ scope與您的實際控制器相關聯。我們正在討論$ scope,你所說的「全局$範圍」可能是$ rootScope。是的,使用$ rootScope(對於那些需要),這是一個不好的習慣。 – Luxor001

+0

只是爲了澄清:當你聲明一個控制器時,你可以注入它的實際範圍。使用該範圍它是完美的,因爲它被限制在控制器中。每個控制器都有一個範圍。 – Luxor001