2016-09-30 5 views
1

多分その基本的な誤解かもしれませんが、Angularとng-showに関する小さな問題があります。機能に応じて角張った角度表示があります

私は3つの入力フィールドを持つ簡単なフォームを持っています。 3つの入力フィールドがすべて設定されている場合に限り、情報テキストとともにdivを表示したい。

(別名は 'myControllerCtrl' ですcontrollerAs-構文と、)私のコントローラは以下のようになります。

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-showに条件を入れた場合、

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

のように動作します。だから私の質問は:なぜ私はng-showの式として関数を使用できないのですか?

+0

コントローラはすでにスコープを持つと '$ scope' – Pankaj

+0

に、この関数を添付されたとしてだけでNG-ショー=試みる' 'NG-ショー=「checkIfAllValuesAreSetを()」み「checkIfAllValuesAreSetを()」 –

+0

あなたはそれを修正した場合、それは動作しますあなたのエイリアスは 'myControllerCtrl'ではないので、2番目の条件が働いています。 –

答えて

1

ng-show="myControllerCtrl.checkIfAllValuesAreSet()"は、コントローラ/テンプレートがロードされたときに1回だけ実行されます。したがって、フォーム上で何かを変更した場合、関数を再度トリガーするものはありません。

あなたは単にであるためにあなたのngのショーを変更できます。これらの変更のいずれかの場合は、直ちに更新します

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

+0

うん: は見てみましょうそれは私が自分自身を考え出し、私の質問であなたに語ったことです、なぜ私はそれが機能とうまくいかないのか不思議に思っていました。しかし、私は問題があなたが言ったように、関数は、3つの値direcltyとのバインディングのように、1つだけ呼ばれて取得されると思います...ありがとう!私は今まで私の問題に対する唯一の正しい答えだと思う。 – Vortilion

0

関数を式として使用できますが、関数がbooleanを返すことを確認してください。これを試してみてください :あなたは$scopeを使用していない

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.checkIfAllValuesAreSet = function() { 
    return vm.annualConsumption && vm.calorificVal && vm.zNumber; 
} 

はので、あなたのHTMLにあなたができるようやってます:コントローラの範囲に機能を取り付け、あなたが行ってもいいです

ng-show="checkIfAllValuesAreSet()" 

が覚えて、$scopeは非常に重要な概念ですanglejsの。それを使用しないようにしようとすると悪いアイデアです。 $ scope についてのドキュメントを読むことができます。

+0

申し訳ありませんが、その時点で私は反対する必要があります...グローバル$スコープを使用するのは良い習慣ではなく、代わりに "var vm = this;"すべてのAngularJSの開発者はあなたにこれを教えています..そうでないと、スコープエラーが多く発生します... – Vortilion

+0

実際のコントローラにリンクされている$ scopeです。私たちは$ scopeについて話しています。あなたが話している "global $ scope"はおそらく$ rootScopeです。とはい、$ rootScopeを使用して(それらのニーズのために)それは悪い習慣です。 – Luxor001

+0

ちょうど明確にする:コントローラを宣言するとき、あなたは実際の範囲を注入することができます。そのスコープを使用すると、コントローラーに閉じ込められているので完全にうまくいきます。すべてのコントローラには有効範囲があります。 – Luxor001

関連する問題