2015-06-10 52 views
0

我在聽$ routeChangeSuccess一個控制器內:

// In MyController 
$scope.$on("$routeChangeSuccess", (a, b, c) => { 
      console.log(a, b, c); 
}); 

此工作正常時,路線變化的應用程序內導航的結果,但並不總是直接在瀏覽器如去一個URL時/我的新的URL

性能取決於控制器的定義,其中:

<div ng-controller="MyController"></div> 

如果這是主要的index.html,似乎每一次工作,但是:

<mydirective ng-controller="MyController"></mydirective> 

有:

app.directive('myDirective', function() { 
    return { 
    templateUrl: '<SOME_CONTENT>' 
    } 
}); 

或確實:

<mydirective></mydirective> 

和:

app.directive('myDirective', function() { 
    return { 
    controller: "MyController", 
    templateUrl: '<SOME_CONTENT>' 
    } 
}); 

後兩項只聽到$ routeChangeSuccess的時間大約50% - 這可能是由於一些編譯/消化的競爭條件。

我更喜歡在指令定義中設置我的控制器 - 它很整潔,看起來很好地模塊化,沒有多餘的標記。不幸的是,它不經常工作。

附註:爲什麼我要這樣做?

我正在努力應對Angular似乎拒絕使用的應用程序設計模式 - 我的應用程序中有許多獨立的模塊,它們都同時存在,我希望它們響應以適當的方式更改URL。

我真的不明白爲什麼這麼難實現。 $ routeProvider沒有什麼用處,因爲我的路由只能有一個視圖/控制器 - 如果我想構建一個單頁面網站,這很好,但如果我想用一個複雜的UI構建一個單頁面應用程序。 ui路由器插件並不是我正在尋找的任何一種 - 它更多的是關於具有可選路線的州。

這是網絡 - 網址是神聖的!我想盡可能多地使用它,並且我希望應用程序中的每個組件或模塊都能根據URL知道它應該做什麼。我不確定爲什麼Angular這麼辛苦。

回答

0

對於任何要捕捉事件的組件,當引發even時必須將該組件加載到內存中。

如果您已經使用ng-view's並且controller \ directives被定義爲在ng-view中加載的partials,那麼您訂閱和收聽該事件爲時已晚。當部分被加載到ng-view中時加載的控制器尚未準備好處理該事件。

ng-view以外的任何東西都是全球性的,並且始終可以訂閱此類活動。

+0

感謝您 - 我開始瞭解我的問題的原因。我在想我的應用程序結構是否錯誤?你能提出一個更好的方式來做我想做的事嗎? – user888734

+0

無論在'ng-view'內部加載什麼都可以被認爲具有它所依賴的路由的生命週期。如果您有多個活動的模塊,則它們不能與視圖相關。這些可以是所有服務。也許你的具體例子可以提供幫助。 – Chandermani