2014-04-12 145 views
2

我對Angular相對較新,但我是一位相當有經驗的開發人員。到目前爲止,我在構建我的應用程序以使用CMS方面取得了一些進展。我有點失落,但是在我的模型中處理數據的'正確'方法是什麼。AngularJS應用程序體系結構

這最好用一個例子說明:

因爲我鉤住我與CMS角前端,路由(頁)在CMS情況下才存在。這意味着路由也應該是動態的。我已成功地獲得動態路由東西的工作,但是當我嘗試做的事情以正確的方式(實際上是從服務器獲取數據),我碰到一些問題...

app.config(function($provide, $routeProvider) { 
$provide.factory("$routeProvider", function() { 
    return $routeProvider; 
    }); 
}); 
// Load the dynamic routes from the API... 
app.run(function($routeProvider, $http, $scope, logger, siteRoutes) { 
    $routeProvider.when('/', { templateUrl: '__views/', controller: 'ContentPageController' }); 
    $routeProvider.otherwise({redirectTo: '/'}); 
}); 

換句話說,我注入一個服務到我的app.run方法(siteRoutes),並且這個應該連接到API。

所以我siteRoutes是一種服務:

cmsModule.service('siteRoutes', function siteRouteFactory(apiConnection, logger) 
// SNIP 

而在這個服務,我注入我一般apiConnection服務:

cmsModule.factory('apiConnection', ['$q', '$http', '$timeout', 'logger', function apiConnectionService($q, $http, $timeout, logger) 

我想是這樣的:

我想siteRoutes服務一次加載數據,而不是每次都執行連接。我這樣做以下列方式:

bla.service('example', function() { 
    var service = { 
     get: function(apiStuff) { // DO API CONNECT WITH .THEN HERE }, 
     data: {} 
    } 
    service.get(); 
    return service; 
} 

我想實現這一處理所有$ Q東西(我廠)API的一個切入點,我認爲我需要處理所有的。那麼()的東西,在我的siteRoutes對象,這就是我所做的。

現在,我的app.run方法發生了什麼,我沒有得到任何數據的siteRoutes對象。所以我認爲我需要做一個。那麼那裏呢?

但這讓我質疑將所有邏輯放在單獨的工廠中進行連接的整個設計,因爲我基本上喜歡我的應用程序來使用數據並讓我的庫處理異步的東西(如果你得到我的我說)...

希望這是明確的。

TL; DR - >如何讓你的服務/工廠處理異步的東西,而不是讓你的'應用'處理它?

+0

恐怕我不明白關於從服務器上加載動態路徑的一點。路徑的名稱是否來自服務器?或者訪問這些路徑時要執行的代碼也單獨服務?或者你是否試圖在某些情況下限制對特定路徑的訪問?你可以擴展一下你想如何在'app.run'中配置'$ routeProvider'嗎? –

+0

我的意思是(服務器端)CMS通常在這種情況下進行路由,這意味着CMS中的用戶定義頁面和類似的東西。 所以,這就是說:我想要做的是:http://www.domain.com/bla/blabla.html - > http://www.domain.com/#/bla/blabla.html與視圖是bla/blabla.html 希望澄清事情?現在我只是試圖從服務器端路由轉移到客戶端路由。 – user3511981

回答

0

templateUrl屬性也可以是一個函數,它將url參數作爲輸入。

在下面的例子中,所有路線將加載一個具有相同名稱的模板。例如, domain.com/#/blabla.html將從服務器加載視圖blabla.html

myApp.config(['$routeProvider', function ($routeProvider) { 
    $routeProvider 
     .when('/:templateName', 
     { 
      templateUrl: function (params) { 
       return params.templateName + ".html"; 
      } 
     } 
     ) 
     .otherwise({ redirectTo: '/main' }); 
}]);