5

我有一個自定義指令myDirective,它執行元素上的任務。ng-if中的AngularJS指令不會運行

我有這個指令在ng-if

<div ng-if="condition"> 
    <div my-directive></div> 
</div> 

事情是這樣的小提琴:http://jsfiddle.net/hGnvv/只有ng-if條件變成真我$http請求加載之後。

該指令可能在運行時編譯,但從未鏈接,因此代碼從不運行。如果我用ng-show代替ng-if該指令工作正常。

任何解決方案?

編輯:我不能使用ng-show,因爲我在表單中有130個指令。 20條指令無論如何都運行,另一條指令根據我的對象類型運行。

  • ng-if="type == 1"然後加載這些元素
  • ng-if="type == 2"然後加載其它元件等

如果我改變ng-ifng-show,窗體需要787-8來加載,而不是1秒。

+4

你已經有了一個解決方案。用ng-replace代替ng-if – nikhil

+0

我不能那樣做,我在單個表單上有130條指令。如果我用ng-show替換ng-if,那麼所有必須運行的代碼都會使表單變慢(8s而不是〜1s)。 –

+2

如果可能,請使用ng-show。 Ng-if從DOM中刪除元素,所以沒有辦法讓角度來編譯它。 –

回答

2

問題不是指令沒有運行,而是我內部的$watch函數根本沒有運行。我沒有設法理解問題的確切原因,因爲相同的指令在ng-if以外工作良好。

無論如何,將我的$watch更改爲 - >$watchCollection,現在它工作正常,因爲它看到我正在觀看的對象的所有更新。

2

ng-if條件最初是錯誤的,因此元素不存在於DOM中且指令未鏈接。

當NG-如果以後條件變爲true,鏈接回調應該正確觸發,在這些例子中看出:

設置ng-if到真正的按鈕被點擊時:http://jsfiddle.net/q05gret0/

後設置ng-if爲真$http請求已加載:http://jsfiddle.net/fhu8ky62/1/

如果您沒有收到此行爲,則問題可能與繼承範圍有關;檢查ng-if正在監視您的請求正在更新的相同範圍變量。 This article在父/子範圍變量陰影和其他限制上有幾點。

+0

我想在ng-if條件變爲true時運行代碼。問題是,當它變爲true時,指令的鏈接不會運行。 –

+0

啊我現在明白了,會編輯我的回答 – seanhodges

+0

感謝您的幫助,這不是問題。我設法找到它,在下面的另一個答案中發佈它。 –

0

例如,如果你的模型是一樣$scope.item = true,你使用它像ng-if="item"您應將模式變更爲$scope.myvalue = {}和使用這樣的:ng-if="myvalue.item",在所有我的意思是你應該使用對象屬性ng-if不是一個簡單的數值