2017-01-09 4 views
1

ページが読み込まれて2度呼び出されているのはなぜですか?それは正常な行動ですか?独自のng-controllerでng-showで負荷と複数回警告する

別のdiv /コントローラの画像をクリックしてアラートを呼び出しています。 ?????以下に追加されました。

私は以下のようなHTMLマークアップを持っています。

<div class="item-blue" ng-controller="ItemController as item"> 
<div class="col" ng-show="item.checkItem('foo')"> 

次に、私のコントローラには以下のものがあります。

app.controller('ItemController', function() { 
    this.checkItem = function(bar) { 
    alert(bar); 
    }; 
}); 

奇妙な!!!!

https://codepen.io/anon/pen/oBjJyw

答えて

2

これは、AngularJSがng-showに使用する式に「時計」を設定するためです。その後、値が変更されたかどうかを確認するために、式(ダイジェストサイクルと呼ばれる)の間に定期的に式を再評価します。式には関数を呼び出す必要があるため、式が評価されるたびにその関数が呼び出されます。

このダイジェストサイクルは、が頻繁にとなり、発生するタイミングを常に制御することはできません。結果として、(警告を表示する、状態を変更する、などを行うのではなく)値を返すだけなら、ng-ifng-showng-classなどの式で関数を呼び出すだけです。

  • HTTPリクエストは、あなたが$timeout$interval
  • を使用して
  • 明示的$scope.$apply()$scope.$digest()を呼び出す
  • を返します。ここでは

    はちょうどダイジェストを(多くはもっとあります)トリガーの状況の一部です

  • マウスをクリックするか、キーをタイプするかマウスを移動します(これらのイベントを聞く指示が使用されている場合)

これは多くの原因があるため、必要以上に多くの作業をする必要はなく、評価する式はすべて値を返すだけです。

+0

知識を落としてくれてありがとうグレッグ。私はこれを使用して、値を返して表示/非表示にします(trueまたはfalse)。それは容認できる使用法ですか? –

+0

絶対に。式の中で読まれた値と戻り値以上のことを行う唯一の時間は、 'ng-click'、' ng-keypress'などのイベントベースのものです。イベントが発生したときにのみ実行されます。他のほとんどのものは継続的に実行されるので、可能な限り_pure_(副作用がない)である必要があります。 – GregL

0

ItemControllerは複数回ページに表示されていますか?それはあなたが経験している行動を説明することができます。

+0

いいえ。ここにある別のポストでそれを見て、ダブルチェックしました。私はそれがAngularの正常な振る舞いであるかどうかを調べようとしています。 –

+0

最初のdivで 'ng-controller =" ItemController "'を使用し、 'ng-show =" checkItem( 'foo') "'を使用するとどうなりますか? 'checkItem'は' $ scope'にバインドされた関数です、はい? – mykeels

2

ng-showのためにあなたが取っているアプローチに関係なく起こっているように見えるので、角度jの通常の振る舞いです(この場合はcheckItem()メソッドを呼び出す)。警告ボックスをポップアップ)ので、これはコードの誤動作の結果ではないと私は考えています。

関連する問題