2013-07-12 32 views
4

我的Angular應用程序被分成幾個子應用程序。我正在與laravel一起工作,它也負責subapps之間的路由。頁面路由和模板/部分/ RESTful API的不同基礎url

因此,有通過laravel處理以下網址:

MODULEX:/moduleX
ModuleY:/moduleY
ModuleZ,項目N:/moduleZ/item-n(項目無限量)

最後對這些頂級有我的3個Angular子應用程序。 因此,例如:
/moduleZ/item-1/#/hello/world

此外模板,泛音和一個RESTful API在以下網址通過laravel供應:

/templates
/partials
/api

如果我設置的基本URL與html標記<base href="http://www.example.com/app/">我可以使用相關的URL模板,partials和API,但不能用於路由。我會通常不得不添加像這樣的模塊url部分moduleX/#/hello/world

如果我設置基地網址,例如<base href="http://www.example.com/app/moduleX/">,我可以編寫所有鏈接,如#/hello/world,但模板,partials和api請求不再有效。

整個應用程序也坐在一個子文件夾,所以我不能只使用例如/templates

所以基本上我的問題或現在的問題是,處理不同的基地網址的最佳方式是什麼?我不太喜歡它將模塊名稱預先添加到每個鏈接。

回答

3

看看這可能是一個特定的解決方案,但也許你應該使用過濾器的網址? 例如:

.filter('routeFilter', [function() { 
     return function (route) { 

      if (some condition mean this direct html link){ 
       return 'MODULE-X/' + route; 
      }else{ 
       return route 
      } 

     }; 
    }]) 
+0

嗯是的會簡化它。但基本上可以像添加一個php變量或角度模型一樣作爲每個鏈接的前綴。實際上我正在尋找更「全球化」的解決方案。 –

+0

對不起,我沒有給你回答。看看使用**。run **塊和「onRouteChangeStart」事件,它可能會有幫助,並且不要忘記你可以使用全局變量。我的意思是說,你可以把任何php var放入常見的js全局變量中,並通過$ window服務來訪問它。 –

2

我建議你讓(子)的應用程序知道他們真正的基地不是父母的一個,但你讓服務器負責登山路徑結構,找到更高級別的共享資源,缺少地方那些。這也使得它很容易原型新的子應用程序,首先獨立測試通用件的變化等。

在像Apache這樣的網絡服務器中,這看起來像是重寫規則(條件是沒有找到文件),它只是替代父層次結構中的相同文件。

在laravel(根據路由器文檔),它看起來像您可以添加可選的「目錄」到您當前的規則,即:

Route::get('/.../app/templates/{name}', function($name) 
... 

變爲:

Route::get('/.../app/{module?}/{item?}/templates/{name}', function($name, $module, $item) 
... 

然後,您可以使用$ module和$ item,如果您需要使用特定的子應用程序/項目測試資源更改。

使服務器負責處理繼承的缺點是具有不同路徑的相同資源的獨立客戶端提取/緩存。但是,您至少可以通過使用重寫或重定向來選擇大文件無效或訪問延遲。您也可以在後期對生產客戶端中的重要路徑進行硬編碼,並且仍然可以從測試和優雅處理客戶端鏈接中偶然錯誤的層次中受益。

2

如果您使用服務和指令的組合,則可以以更簡單的方式執行此操作。

你可以實現一個類似於ngHref的指令,當給定一個鏈接時,它將轉換它並將給定的鏈接追回。它將被注入一個服務,該服務將爲其提供基礎url或相關url或任何模塊特定的內容。

在指令中注入的此服務將在每個子應用程序的app.config塊中使用serviceProvider進行配置。由於角噴射器只有每個服務的一個實例,我認爲您需要每個子應用程序多於一個噴射器或一個噴射器。它不清楚他們是否在你的應用程序中共享注入器。

您可以根據模塊配置每個服務以返回不同的基路徑。每條鏈接都會被指令附加到每個鏈接。

有了這個,你可以使用<base href="http://www.example.com/app/">,這應該可以解決你的問題。

我沒有寫任何代碼,但我可以幫助,如果你需要它。