Comment charger dynamiquement un modèle basé sur les paramètres d'un itinéraire enregistré avec $ routeProvider?
J'ai trouvé que vous pouvez utiliser un modèle ou templateUrl comme une fonction, telle que
.when('/:controller/:action',{
templateUrl:function(params){
return: '/'+params.controller+'/'+params.action
}
})
Et puis je me demandais si il est possible de lazy load le modèle, mais je ne peux pas faire ce travail
.when('/:ctrl/:action',{
template:function(params){
injector = angular.injector(['ng']);
$q = injector.get('$q');
var dfrd = $q.defer();
//fetch template from server
//dfrd.resolve()
return dfrd.promise;
}
});
Dites-moi s'il vous plaît, il existe une façon - je veux chercher de l'ensemble du modèle en faisant une requête ajax vers le serveur
source d'informationauteur iLemming
Vous devez vous connecter pour publier un commentaire.
Donc, je vois que vous êtes un .NET MVC développeur...
Jetons un oeil à ce que les Actions de .NET MVC: Ils reviennent ActionResults... qui sont vraiment de manifeste pour ce modèle et de la vue doit être exécuté et retourné à partir de l'architecture. Un "contrôleur" dans MVC est une collection de ces actions, et peut contenir une certaine logique partagée entre ces actions sous la forme de méthodes privées ou partagées dépendances sur cette classe.
Maintenant, nous allons jeter un oeil à ce Angulaire est en train de faire: Angulaire est l'appel de la fonction de contrôleur une fois, en tant que constructeur, généralement à mis en place un $objet de l'étendue qui va agir (sorte de) votre "modèle". Chaque contrôleur Angulaire est en général associée à une et une seule façon de mettre en place un $scope**. Une fois que le contrôleur est traitée, $digest est appelée sur le $scope modifiée, qui est ensuite appliquée à la vue qui est liée à la portée... qui est le html encapsulé par l'élément de ng-controller (ou ng-view) attribut.
Donc.. la question, pouvez-vous vous charger dynamiquement les modèles basés sur les paramètres de la route? Oui. Vous avez certainement peut. Le plus simple serait d'acheminer vos demandes à un modèle qui comprenait rien, mais un div avec un
ng-include
sur elle, que vous avez modifié.Dans vos itinéraires:
Alors votre dynamique contrôleur de déclaration:
MyController/MyAction (qui je suppose que vous pouvez générer avec Rasoir) doit retourner quelque chose comme ceci:
... à partir de là, vous définissez votre MyActionCtrl contrôleur à lui tout seul.
Pouvez-vous plier l'architecture de le faire "ASP.Net MVC-esque", dans ce "contrôleur" a tout un tas de "l'action" des fonctions qui dictent le comportement de votre point de vue? Ouais... Mais non sans avoir fait votre demande vraiment ridicule avec des instructions de commutation et la comme... Si vous ne voulez probablement pas à le faire.
À la fin vous allez avoir à sortir de l'état d'esprit de ASP.Net MVC "des Contrôleurs et des Actions" Angulaire. C'est une architecture MVC, mais MVC != "Les contrôleurs && actions".
** Angulaire crée et enregistre une instance du contrôleur comme un objet, mais cette option est rarement utilisée dans Angulaire de développement, et je ne parle pas de ça ici, pour dire.)
Comme l'a souligné, les modèles chargé par templateUrl sera pas chargé dans des circonstances normales, et il existe des méthodes de jouer avec le cache si vous avez besoin d'autre chose que de la norme.
Ce commentaire semble être le nœud de la question:
Ce n'est pas nécessairement de façon normale de travailler avec angulaire. Il peut avoir son utilité, mais c'est hors des sentiers battus. Habituellement, les modèles sont à l'abri de tout ce qui est sensible au contexte, car ils représentent le code qui obtient son état critique de l'information à partir de $champ d'application ou des paramètres d'une certaine sorte. Alors pourquoi ajax?
Quel est votre modèle de vouloir/besoin qui viennent à partir d'une requête ajax? La réponse à cette question peut aider avec l'ultime décision de la manière de procéder de façon plus efficace et au bon endroit.
Peut-être que vous voulez ou besoin d'un certain côté serveur dynamisme à être partie de votre système, ou qu'il existe d'autres façons de le faire que d'avoir un ajax retour de définir le modèle.
Mise à jour: donc, vous avez dit que "Sur la route du changement j'ai besoin d'obtenir un modèle à partir du serveur, de manière asynchrone à l'aide de $http".' Mais c'est tout intégré à templateUrl. @wmluke semble avoir présenté quelques alternatives intéressantes.
Si nous nous contentons d'accepter que vous avez besoin d'ajax pour obtenir votre modèle, puis ici, c'est un plus de possibilité. Avec l'interface utilisateur du routeur vous pouvez utiliser un templateProvider -- qui pourrait vous appeler propre service personnalisé qui ne ajax et tout ce que vous voulez.
Cet exemple renvoie simplement Bonjour tout le monde asynchronosly, mais vous pouvez appeler votre propre service ou exécuter directement des requêtes ajax, si vous vouliez.
Achat en ui-router est un potentiall plus grand engagement, mais il pourrait donner des récompenses ci-dessus juste être capable d'écrire du code pour produire des modèles. Bonne chance!
Pourquoi ne pas simplement contourner
templateURL
tous ensemble et avoir vos contrôleurs intercepter les demandes?Vous serez en mesure de dynamiquement lazy load pages par URL
Éventuellement intercepter les partiels.
config.js
controllers.js
index.html
Angulaire modèles sont paresseux, chargé par défaut. Plus précisément, les modèles ne sont pas récupérés jusqu'à ce qu'ils sont nécessaires, et puis ils sont mis en cache dans $templateCache.
Cependant, d'après votre exemple, je soupçonne que vous êtes à la recherche pour le
resolve
attribut pour les définitions de route dans $routeProvider. Cet attribut permet de passer de la promesse des dépendances à un contrôleur. Voir le retard exemple dans $route...Aussi, vous pourriez être intéressés de préchargement de certains modèles, mais le chargement différé des autres. Dans ce cas, vous devriez vérifier...
Vous pouvez voir un exemple de travail de deux modèles chargés dynamiquement en fonction de paramètres à l'angle de docs site ngInclude - Exemple de Paragraphe.
Ici est la Plunker exemple.