2012-10-23 15 views
11

Si consideri il codice:

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) {...}); 

A seconda URL, voglio sia StrategyOne, o StrategyTwo, o StrategyThree da iniettare, quando si costruiscono MyController. Una pseudo-codice per illustrare l'idea:

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" }); 
}); 

Qualsiasi cambiamento posso realizzare qualcosa di simile con AngularJS?

risposta

25

Sì! AngularJS è in grado di gestire questa operazione con molta facilità grazie alla proprietà resolve di una definizione di percorso (ulteriori informazioni here).

Quindi, in pratica si potrebbe scrivere qualcosa di simile:

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"}}); 
}); 

di avere la corretta strategia iniettato nel vostro controller! AngularJS DI al suo meglio!

C'è un ottimo video tutorial che fare con i resolve argomenti, si potrebbe trovare interessante: http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcp

+1

OMG, sono stato sicuro che è possibile, ma non l'ho aspettava è _that_ facile. Grazie! :-) – agibalov

+0

Funziona ancora? Mi sto imbattendo in un problema dichiarato [qui] (https://groups.google.com/forum/#!msg/angular/QtO8QoxSjYw/SWxea0tOBGYJ) dove la mia fabbrica viene chiamata una sola volta; e non ogni volta che il percorso dovrebbe essere risolto. – Lucas

+0

@Lucas Questo probabilmente perché le fabbriche sono singleton e vengono chiamate solo una volta! Quello che succede è che la fabbrica viene iniettata nel tuo controller (nessun metodo viene chiamato su di esso), lasciando il controller in contatto con qualsiasi cosa voglia contro il tuo, ad es. nel tuo controller 'StrategyOne.getContent()' – WickyNilliams

Problemi correlati