2017-01-09 24 views
1

爲什麼我的警報在頁面加載時被調用並被調用兩次?這是正常的行爲嗎?ng-show在加載和多次加載時擁有自己的ng-controller警報

我還在另一個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-show,ng-class等等。

這裏只是一些這引發消化的情況下(還有更多):

  • HTTP請求返回
  • 你叫$scope.$apply()$scope.$digest()明確
  • 使用$timeout$interval
  • 單擊鼠標,鍵入一個鍵或移動鼠標(如果使用聽取這些事件的指令)

正如你可以看到的那樣,這有很多原因,所以你不想在它裏面做更多的工作,而且它所評估的所有表達式只應該返回值。

+0

感謝您放棄知識Greg。我正在使用它來返回一個值,然後隱藏/顯示(true或false)。這是可接受的用法嗎? –

+0

絕對如此。只有在表達式中讀取值和返回值的唯一時間是基於事件的事件,如'ng-click','ng-keypress'等。它們只在事件發生時才運行。大多數其他事情會持續運行,所以應該儘可能地避免副作用。 – GregL

0

是否ItemController頁面上出現不止一次?這可以解釋你正在經歷的行爲。

+0

沒有。看到在這裏的另一個職位,並再次檢查。我只是想弄清楚這是否是Angular的正常行爲。 –

+0

如果你在第一個div中使用ng-controller =「ItemController」,那麼會發生什麼,而ng-show =「checkItem('foo')」'? 'checkItem'是綁定到'$ scope'的函數,是嗎? – mykeels

2

這是角js中的一個正常行爲,因爲它看起來繼續發生,不管你因爲ng顯示而採取的方法,angular試圖檢查條件(在這種情況下調用一個方法「checkItem()」,它彈出一個警告框),所以我不認爲這是任何代碼故障的結果。