2015-02-24 126 views
1

是否可以手動重新編譯嵌套在另一個指令內的指令?重新編譯AngularJS嵌套指令

我有一個modal-create-task指令,它使用showCreateTaskModal事件和一些數據一起初始化。根據隨事件發佈的數據,模式會更改其UI佈局,並會更改名爲search-projects的嵌套指令的行爲。

我現在遇到的問題是,我需要重新編譯search-directive,因爲它需要與showCreateTaskModal進來的數據被解僱。

這是模態模板的樣子:

<div class="ui modal" id="modalCreateTask" ng-controller="ModalCreateTaskCtrl"> 

    <search-projects oo-filter="{{ mode }}" oo-subject="searchProjectSubject"></search-projects> 

</div> 

正如你可以看到兩個oo-filteroo-subject屬性取決於連接到showCreateTaskModal事件的數據,但該事件時,編譯器後,僅啓動通過DOM,然後該指令無法訪問所需的數據,因此它回退到默認行爲。

這是search-projects定義:

angular.module('app.ui.search.projects').directive('searchProjects', function(ConfigService) 
{ 
    return { 
     restrict : 'E', 
     templateUrl : ConfigService.path.views + '/search/projects.html', 
     scope : { 
      filter : '@ooFilter', 
      subject : '=ooSubject' 
     } 
    } 
}); 

編輯1:

根據要求,我會試着更好地解釋我在做什麼。

我有一個模式,包含另一個指令,基於某些變量的內容,應該查詢服務器的數據,每當屬性發生變化。

我想重新編譯指令,以便再次執行init()函數。

做一些研究我也注意到有可能使用$watch但我不知道這是否是一個好的解決方案。

+0

有許多方法可以重新編譯,但幾乎不需要。你能否更詳細地解釋一下(可能是用一個說明性的例子)你試圖達到什麼目的?什麼數據可用,何時。爲什麼數據本身不能重新生成? – 2015-02-24 14:23:14

+0

@NewDev我在我的問題中增加了更多信息,所以現在應該更清楚了。 – siannone 2015-02-24 16:03:06

+0

你絕對可以使用'$ watch'來對數據的變化作出反應。好於重新編譯,肯定是 – 2015-02-24 16:06:00

回答

2

指令要求重新編譯是非常罕見的。這可能表明了一種錯誤的方法或設計。

指令對數據作出反應。通常,數據通過屬性,廣播事件或控制器的共享服務傳遞給指令。具體而言,隔離範圍使用單向和雙向數據綁定將數據傳遞給指令。

在沒有觸發不同的,人們可以$watch更改:

link: function(scope){ 
    scope.$watch("scopeVar", function(){ 
    // do something, like run init() again 
    }); 
} 

另一種方法是通過直接觸發從服務,類似於如何Angular-UI $modal服務工作。該模式的情況下公開的方法,例如,從控制器關閉模式(指令):

modalInstance.close(result); 

這種想法可以被同樣用於觸發使用相同的服務指令的一些行動。

1

根據來自事件的數據,將「ng-if」條件附加到「search-projects」指令中。所以,你的代碼可能是這樣的:

<div class="ui modal" id="modalCreateTask" ng-controller="ModalCreateTaskCtrl"> 

    <search-projects oo-filter="{{ mode }}" oo-subject="searchProjectSubject" 
     ng-if="dataComingFromEvent"></search-projects> 

</div> 

該指令將再次在DOM當數據在「模式」可放即「dataComingFromEvent」,因此您的指令將被重新編譯。

+0

對不起,您的解決方案部分工作。只有在未設置屬性並重新設置的情況下,該指令纔會重新編譯。如果屬性的值發生變化,那麼該元素不會重新編譯。 – siannone 2015-02-24 15:59:18