2012-10-23 26 views
11

注入控制器的依賴考慮代碼:

var app = angular.module("app", [], function($routeProvider) { 
    $routeProvider 
    .when("/page1", { controller: "MyController" }) 
    .when("/page2", { controller: "MyController" }) 
    .when("/page3", { controller: "MyController" }); 
}); 

app.factory("StrategyOne", function() {...}); 
app.factory("StrategyTwo", function() {...}); 
app.factory("StrategyThree", function() {...}); 

app.controller("MyController", function(Strategy, $scope) {...}); 

根據URL,我想無論是StrategyOne,或StrategyTwo,或StrategyThree被注入,構造MyController時。一個僞代碼來說明這個想法:

var app = angular.module("app", [], function($routeProvider) { 
    $routeProvider 
    .when("/page1", { controller: "MyController", Strategy: "StrategyOne" }) 
    .when("/page2", { controller: "MyController", Strategy: "StrategyTwo" }) 
    .when("/page3", { controller: "MyController", Strategy: "StrategyThree" }); 
}); 

任何更改我可以用AngularJS實現這樣的事情嗎?

回答

25

是的! AngularJS可以很容易地處理路由定義的resolve屬性(更多信息here)。

所以,基本上你可以寫這樣的:

var app = angular.module("app", [], function($routeProvider) { 
    $routeProvider 
    .when("/page1", { controller: "MyController", resolve: {Strategy: "StrategyOne"}}) 
    .when("/page2", { controller: "MyController", resolve: {Strategy: "StrategyTwo"}}) 
    .when("/page3", { controller: "MyController", resolve: {Strategy: "StrategyThree"}}); 
}); 

有適當的戰略注入到你的控制器! AngularJS DI處於最佳狀態!

有一個很好的視頻教程對付resolve主題,你會覺得很有趣:http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcp

+1

OMG,我一直相信這是可能的,但我沒料到它的_that_容易。謝謝! :-) – agibalov

+0

這是否仍然有效?我遇到了一個[這裏]聲明的問題(https://groups.google.com/forum/#!msg/angular/QtO8QoxSjYw/SWxea0tOBGYJ)我的工廠只被調用一次;而不是每次路線都要解決。 – Lucas

+0

@Lucas這可能是因爲工廠是單身人士,而且只有一次!會發生什麼情況是工廠被注入到控制器中(沒有任何方法被調用),讓你的控制器可以調用任何它喜歡的東西,例如,在你的控制器'StrategyOne.getContent()'中 – WickyNilliams