champ d'application et de contrôleur de l'instanciation avec l'interface utilisateur du routeur
Je suis confus au sujet de quand contrôleurs obtenir instancié. Aussi, comment puis-contrôleurs est instanciée lors de l'imbrication des états. J'ai peut-être confondu comment le champ d'application sont attachées à vue et le contrôleur, c'est-à-dire si chaque vue possède son propre contrôleur et de la portée ou partagent-ils la même portée.
Quelqu'un peut-il expliquer quand contrôleurs obtenir instancié? Sous imbriqués les routes de faire tous les points de vue de partager un contrôleur et la portée? Ce qui se passe quand je passe états et de revenir à un état fait une autre contrôleur obtenir instancié?
Ci-dessous sont mes itinéraires(fichier de configuration ):
.config (googleAnalyticsCordovaProvider, $stateProvider, $urlRouterProvider, IdleProvider, KeepaliveProvider) ->
$stateProvider
.state('app', {
url: '/app',
abstract: true,
templateUrl: 'templates/menu.html',
controller: 'AppController'
})
.state('app.pincode', {
url: '/pincode',
views: {
menuContent: {
templateUrl: 'templates/pincode-yield.html',
controller: 'PincodeController'
}
}
})
.state('app.pincode.create', {
url: '/create',
views: {
pincode: {
templateUrl: 'templates/pincode-create.html',
controller: 'PincodeController'
}
}
})
.state('app.pincode.pincodeLogin', {
url: '/login',
views: {
pincode: {
templateUrl: 'templates/pincode-login.html',
controller: 'PincodeController'
}
}
})
.state('app.pincode.settings', {
url: '/settings',
views: {
pincode: {
templateUrl: 'templates/settings.html',
controller: 'PincodeController'
}
}
})
Vous devez vous connecter pour publier un commentaire.
Même pour obtenir des réponses plus détaillées, on peut/doit observer la code source et vérifier la documentation. Laissez-moi vous expliquer tous les trois questions (et également citer de code et doc).
Ici, nous pouvons observer le code de la
ui-view
directive:[$ViewDirective.$inject = \['$state', '$injector', '$uiViewScroll', '$interpolate'\];][1]
Contrôleurs sont liées à vues. Ceux
views
, qui sont définies à l'intérieur d'un.state()
comme leviews
objet:Donc, lorsque c'est vue (le
ui-view
) rempli avec les paramètres définis à l'intérieur d'un état, il agit presque comme un standard, mais amélioré la directive.1) le Modèle est trouvé,
2) Résout des sont résolus
...
x) Contrôleur est instancié...
Vue cibles (
ui-view
directives) pourrait utiliser les noms, et pourrait être rempli par les différents états dans la hiérarchie.Cela peut vouloir dire qu'il pourrait y avoir un contenu à l'intérieur d'un point de vue (par exemple titre), défini par parent ainsi que remplacé par enfant
Au-dessus de la définition de l'état sera (à chaque fois que nous la transition entre ces deux états) faire:
La
$state.go('parent')
- la vue (modèle, contrôleur...) définies dans'title@parent' : { ...}
seront injectés dans la cibleui-view="title"
et instancié comme décrit ci-dessusLa
$state.go('parent.child')
- presque la même chose, juste le point de vue soit pris d'état d'enfant/afficher la définition'title' : { ...}
. Qui va remplacer le contenu de laui-view="title"
et sera instancié comme décrit ci-dessusCe qui va se passer à chaque fois nous faire aller de l' du parent à l'enfant et d'un enfant à un parent.
Une réponse simple est PAS, il est pas partage commun.
En fait, chaque contrôleur a son propre champ, le seul qui est créé à partir de parent portée de vue. Tout d'abord la documentation:
Donc, lorsque c'est notre
controller
(bien le vue avec modèle, contrôleur...) injecté dans du parent cibleui-view="..."
il obtient hérité portée:Qu'en un mot signifie que objets JS (par exemple
scope.Model = {}
) peut être partagée entre enfant et parent.Cependant, le code Javascript de base les types ne sont pas passés par référence, et donc leurs valeurs ne sont pas automatiquement synchronisé entre les portées:
Il est intéressant de lire plus au sujet de l'héritage par prototype ici:
Quelles sont les nuances de portée prototypes /l'héritage par prototype dans AngularJS?
Il dépend.
Si le parent sous vue (rappelez-vous
ui-view="title"
ci-dessus) est remplacé par la vue enfant, et puis c'est re-créé (la transition de l'enfant vers le parent) - traitement de wil être ré-initialisé (voir ci-dessus).Mais lorsque nous parlons de la principal de la vue parente (généralement sans nom), ce qui représente le parent (Par exemple sans nom de la vue ci-dessous avec le contrôleur 'ParentMainCtrl')
Alors nous pouvons être sûrs que le contrôleur n'est PAS nouveau instancié. Il vit au cours de la durée de vie de tous ses enfants, plus d'un parent d'un (pas d'état d'enfant sélectionné).
De re-charger ce point de vue/contrôleur, nous devons utiliser une option
reload
$etat.faire, params, options)
{boolean=false}
, Si elle est vraie force de la transition, même si l'état ou les paramètres n'ont pas changé, aka un rechargement du même état. Il diffère de reloadOnSearch parce que vous utilisez ce mode lorsque vous voulez forcer un rechargement quand tout est la même, y compris la recherche params.Espère que ça aide un peu. Pour de plus amples informations, consultez les ressources suivantes:
Contrôleurs obtenir instancié à chaque fois que vous visitez le spécifique de l'état. Par exemple, lors de la visite de
app.pincode.pincodeLogin
pour la première fois unAppController
et deuxPincodeControllers
sont construits, chacun avec son propre point de vue en supposant que vous avez les modèles de droit. Commutation de'app.pincode.settings'
détruire le plus profond de contrôleur et de le remplacer par un nouveau, bien que les deux contrôleurs supérieur de la hiérarchie ne sera pas touché. Les étendues de suivre la norme AngularJS' motif d'héritage, ils ne sont pas isolés.Vous allez probablement vouloir supprimer les contrôleurs dans le sous-états (et de gérer la logique métier du contrôleur de parent) ou ont un contrôleur pour chaque état, le même contrôleur pour des modèles différents et des points de vue est généralement le signe d'une mauvaise conception.
Contrôleurs obtenir instanciée au moment où les vues sont chargés pour la première fois.
Par exemple, si vous avez 3 onglets associés avec 3 manettes - puis le contrôleur associé à l'affichage par défaut instancie en Premier. Ensuite, lorsque vous chargez les autres vues de l'associé, les contrôleurs obtenir instancié.
Mais il est intéressant de noter, une fois un point de vue est chargé dans les DOM - il est mis en cache par défaut. Lorsqu'une vue est de naviguer loin de la, son élément est à gauche dans les DOM, et son champ d'application est déconnecté de l' $watch cycle. Lors de la navigation à vue qui est déjà dans le cache, son champ d'application est ensuite reconnecté, et que l'élément qui a été laissé dans les DOM devient la fenêtre active.
editController
dans toutes les vues imbriquées, mais je veux utiliser les différents contrôleurs direeditDetailsController
pouredit.details
eteditInfoController
pour edit.info. Je sais comment pouvons-nous y parvenir??