ui-router的探究

首先是示例:

wKiom1lUsyXTImlrAAAiSnHUZrM068.png-wh_50


這是我自己寫的一個路由demo,這裏我們可以看到,頁面由一個導航條,以及內容頁組成,導航條上有三個按鈕,分別對應了三個頁面,而頁面會在內容頁進行更新,並不會重新請求新頁面。

wKioL1lUsyXi4NCtAABW0TfxUD0347.png-wh_50

wKiom1lUsyXSiVIlAACg2DAmfEY688.png-wh_50


而我們看到的home頁上的三行文字,並不是在同一個頁面上,實際上是由額外的3個頁面組織起來的。

wKioL1lUsybhlUG0AAA_TFIRHgs063.png-wh_50

 

ui-sref-active指令檢測當前的激活狀態,如果你的頁面激活的是這個路由,則該標籤會激活active樣式,ui-sref定義了當前按鈕指向的路由,具體地址的組成可以看圖。

 wKiom1lUsybhbkNoAACVYJMRpWc024.png-wh_50


這裏定義了具體的路由策略。

如果路由到/home,則目標的模板地址爲./bt.html(你存放靜態頁面的路徑),以此類推

home.bt2則定義了該路由的子路由,以此類推。

最後一行代碼定義了非定製的路由策略請求時會重定向到/home/bt2/bt3,注意這裏書寫的參數格式!!!

這樣,當我們訪問這個頁面時,會通過重定向引導到/home/bt2/bt3的URL上,所以在該過程中所有的相關html都會被加載,我們從網絡請求就可以看出,路由是根據頁面的請求順序依次向服務器請求頁面的。

wKiom1lUsyfTvLg7AACU5PRpDUs290.png-wh_50


最近在工作裏發現項目裏的路由定義裏有這麼一句:

targetHeader: {org: true, space: false},

後來本人也寫了個demo嘗試了一下,弄懂了這句話的用途以及在項目裏的功能。

wKioL1lUtDGi7kmvAADpydxc94k884.png-wh_50

首先,本人在路由定義裏也加了這幾句話,並且在對應頁面的控制器里加了作用域的賦值表達式。

wKioL1lUtJnBVu1hAAAWujGVdHA466.png-wh_50

查詢了ui-router的文檔,在路由中由用戶自行定義的屬性可以在$state的current屬性中獲取到,我們將它賦值給$scope對象對應的屬性。

然後就可以在頁面中顯示它。

頁面代碼:

<div class="header">我是bt,我接收到了targetHeader.org:`targetHeader`.`org`,和targetHeader.space:`targetHeader`.`space`</div>

wKiom1lUtVrRgTGLAAAridm9xQA897.png-wh_50

之後我給每一個子路由都給了個自定義屬性,然後發現了一個問題。項目中這個組件是一直存在的,如果不是重新發送請求的話,這個組件的作用域狀態不會更改,即使我們在路由上重新定義了屬性的值。

那麼怎麼解決這個問題呢?

我查看了一下$state的源代碼,看有這麼一行代碼

$rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);

這不就是之前研究過的作用域通信嗎?所以,我們只要在代碼裏捕獲這個句柄,在路由狀態改變時重新獲取一次值就可以了

代碼如下:

$rootScope.$on("$stateChangeSuccess", function() {
    $scope.targetHeader = $state.current.targetHeader;
});


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章