Je veux savoir comment utiliser plusieurs contrôleurs pour une application d'une seule page. J'ai essayé de le comprendre et j'ai trouvé des questions très similaires aux miennes, mais il y a juste une tonne de réponses différentes pour résoudre un problème spécifique où vous finissez par ne pas utiliser plusieurs contrôleurs pour une seule application de page.
Est-ce parce qu'il ne serait pas sage d'utiliser plusieurs contrôleurs pour une seule page? Ou n'est-ce pas possible?
Disons que j'ai déjà un contrôleur de carrousel d'images qui fonctionne sur la page principale, mais j'apprends ensuite à (disons) utiliser des modaux et j'ai besoin d'un nouveau contrôleur pour cela également (ou de toute autre chose dont j'ai besoin d'un contrôleur). Que vais-je faire alors?
J'ai vu des réponses à d'autres questions où ils posent à peu près les mêmes choses que moi et les gens répondent "* OMG. Pourquoi feriez-vous même cela, faites-le simplement ...".
Quelle est la meilleure façon de procéder ou comment procédez-vous?
Éditer
Beaucoup d'entre vous répondent simplement pour déclarer deux contrôleurs, puis utiliser ng-controller pour l'appeler. J'utilise ce morceau de code ci-dessous, puis j'appelle MainCtrl avec ng-controller.
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: "templates/main.html",
controller:'MainCtrl',
})
.otherwise({
template: 'does not exists'
});
});
Pourquoi ai-je même besoin de définir un contrôleur ici si je peux simplement utiliser ng-controller sans lui? C'est ce qui m'a dérouté. (et vous ne pouvez pas ajouter deux contrôleurs de cette façon, je pense ...)
la source
when: /home, controller: MainCtrl
. vous ne pouvez pas ajouter plus que cela, ou vous voulez simplement l'appeler avec le ng-controller?Réponses:
Quel est le problème? Pour utiliser plusieurs contrôleurs, utilisez simplement plusieurs directives ngController:
Vous devrez avoir les contrôleurs disponibles dans votre module d'application, comme d'habitude.
La façon la plus simple de le faire pourrait être aussi simple que de déclarer les fonctions du contrôleur comme ceci:
la source
when /home, controller: MainCtrl
ng-controller
dans plusieurs éléments DOM, c'est par exemple dans un scénario où de nombreux éléments sont imprimés sur le DOM viang-repeat
. Disons que chacun d'entre eux appelle àng-controller="myController
. À partir de certains des journaux de console que j'ai vus dans mon application,myController
se réinitialise avec CHAQUE élément rendu dans le DOM qui l'appelle .... Peut-être que j'ai foiré quelque chose dans mon utilisation particulière, ou peut-être au-delà de la portée des OP question, mais curieux de savoir si d'autres en ont fait l'expérience non plus ....Je pense que vous manquez le sens "application d'une seule page".
Cela ne signifie pas que vous aurez physiquement un fichier .html, mais plutôt un
index.html
fichier principal et plusieurs fichiers .html NESTED. Alors pourquoi une seule page? Parce que de cette façon, vous ne chargez pas les pages de la manière standard (c'est-à-dire un appel de navigateur qui rafraîchit complètement la page entière) mais vous chargez simplement la partie de contenu en utilisant Angular / Ajax. Comme vous ne voyez pas le scintillement entre les changements de page, vous avez l'impression que vous n'avez pas bougé de la page. Ainsi, vous avez l'impression de rester sur une seule page.Maintenant, je suppose que vous voulez avoir PLUSIEURS contenus pour votre application SEULE PAGE: (par exemple) accueil, contacts, portfolio et magasin. Votre application à page unique / à contenu multiple (de manière angulaire) sera organisée de cette façon:
index.html
: contient l'en-tête<ng-view>
et le pied de pagecontacts.html
: contient le formulaire de contact (pas d'en-tête, pas de pied de page)portfolio.html
: contient les données du portefeuille (pas d'en-tête ni de pied de page)store.html
: contient le magasin, pas d'en-tête, pas de pied de page.Vous êtes dans l'index, vous cliquez sur le menu appelé "contacts" et que se passe-t-il? Angular remplace la
<ng-view>
balise par lecontacts.html
codeComment y parvenir? avec
ngRoute
, comme vous le faites, vous aurez quelque chose comme:Cela appellera le bon html en lui passant le bon contrôleur (veuillez noter: ne spécifiez pas de
ng-controller
directivecontacts.html
si vous utilisez des routes )Ensuite, bien sûr, vous pouvez déclarer autant de directives ng-controller dans votre page contacts.html. Ce seront les contrôleurs enfants de
ContactCtrl
(héritant ainsi de lui). Mais pour une seule route, à l'intérieur durouteProvider
, vous pouvez déclarer un seul contrôleur qui agira comme "contrôleur père de la vue partielle".EDIT Imaginez les templates / contacts.html suivants
ce qui précède
routeProvider
injectera un contrôleur dans votre div contenant. Fondamentalement, le html ci-dessus devient automatiquement:Quand je dis que vous pouvez avoir d'autres contrôleurs, cela signifie que vous pouvez brancher des contrôleurs sur des éléments DOM internes, comme suit:
J'espère que cela clarifiera un peu les choses.
UNE
la source
<div ng-controller="FancyStuffController">
intérieur d'une balise de corps qui a déjà un contrôleur associé,<body ng-controller="BodyController">
cela fonctionnera?$apply already in progress
Je reçois des erreurs quand je fais cela, mais je pense que c'est lié à dpd.js. Pour ne pas entrer dans cela, je pense que c'est juste le charger deux fois ou quelque chose du genre, je ne sais pas comment, mais mon utilisation du contrôleur tente peut-être de recharger cela.Je suis actuellement en train de créer une application d'une seule page. Voici ce que j'ai jusqu'ici qui, je crois, répondrait à votre question. J'ai un modèle de base (base.html) qui contient un div avec la
ng-view
directive. Cette directive indique à angular où placer le nouveau contenu. Notez que je suis moi-même nouveau dans angularjs, donc je ne dis pas que c'est la meilleure façon de le faire.base.html
la source
when /home
when
de. Je veux deux contrôleurs pour un seul modèle. Ou maman j'ai mal compris ce que tu essayais de me dire?menuController a accès au menu div. Et widgetController a accès aux deux.
la source
Nous pouvons simplement déclarer plus d'un contrôleur dans le même module. Voici un exemple:
la source
Je viens de mettre une simple déclaration de l'application
Ensuite, j'ai construit un service et deux contrôleurs
Pour chaque contrôleur j'avais une ligne dans le JS
Et dans le HTML, j'ai déclaré la portée de l'application dans un div environnant
et chaque champ d'application de contrôleur séparément dans leur propre div environnant (dans le div de l'application)
Cela a bien fonctionné
la source
Vous pourriez également avoir intégré toutes vos vues de modèle dans votre fichier html principal. Par exemple:
De cette façon, si chaque modèle nécessite un contrôleur différent, vous pouvez toujours utiliser le routeur angulaire. Voir ce plunk pour un exemple de travail http://plnkr.co/edit/9X0fT0Q9MlXtHVVQLhgr?p=preview
De cette façon, une fois que l'application est envoyée du serveur à votre client, elle est complètement autonome en supposant qu'elle n'a pas besoin de faire de demandes de données, etc.
la source