Comment mettre en œuvre RouteReuseStrategy shouldDetach pour des itinéraires spécifiques Angulaire 2
J'ai Angulaire à 2 module dans lequel j'ai mis en œuvre le routage et voudrais les états stockées lors de la navigation.
L'utilisateur doit être capable de:
1. recherche de documents à l'aide d'un searchformula
2. accédez à l'un des résultats
3. revenir à searchresult - sans communication avec le serveur
C'est possible, y compris RouteReuseStrategy.
La question est:
Comment puis-je mettre en œuvre que le document ne doit pas être stocké?
De sorte que la voie de chemin de "documents"de l'etat doivent être stockés et de la voie de chemin "documents/:id de" l'état ne doit PAS être stocké?
Vous devez vous connecter pour publier un commentaire.
Hey Anders, la grande question!
J'ai presque le même cas que toi, et je voulais faire la même chose! Recherche d'utilisateur > obtenir des résultats > l'Utilisateur navigue de résultat > l'Utilisateur accède à dos > BOOM ultra-rapide retour aux résultats, mais vous ne voulez pas stocker le résultat spécifique que l'utilisateur à utiliser pour la navigation.
tl;dr
Vous avez besoin d'avoir une classe qui implémente
RouteReuseStrategy
et de fournir à votre stratégie dans lengModule
. Si vous souhaitez modifier lorsque la route est stockée, de modifier lashouldDetach
fonction. Quand il revienttrue
, Angulaire magasins de la route. Si vous souhaitez modifier lorsque la route est attaché, de modifier lashouldAttach
fonction. LorsqueshouldAttach
renvoie true, Angulaire qui se trouvent dans la route à la place de l'itinéraire requis. Voici un Plunker pour vous de jouer avec.Sur RouteReuseStrategy
Par le fait d'avoir posé cette question, vous comprenez déjà que RouteReuseStrategy vous permet de dire Angulaire pas de détruire un composant, mais en fait pour l'enregistrer de nouveau rendu à une date ultérieure. C'est cool, car il permet:
Que la dernière est importante si vous souhaitez, par exemple, de laisser une page temporairement même si l'utilisateur a entré une beaucoup de texte. Les applications de l'entreprise vont adorer cette fonction en raison de la excessive quantité de formes!
C'est ce que j'ai trouvé pour résoudre le problème. Comme vous l'avez dit, vous avez besoin de faire usage de la
RouteReuseStrategy
offert par @angulaire/routeur dans les versions 3.4.1 et plus.TODO
Première assurez-vous que votre projet de a @angulaire/routeur version 3.4.1 ou plus.
Prochaine, créer un fichier qui va s'occuper de votre classe qui implémente
RouteReuseStrategy
. J'ai appelé le mienreuse-strategy.ts
et placé dans le/app
dossier pour la garde. Pour l'instant, cette classe devrait ressembler à:(ne vous inquiétez pas à propos de votre fichier d'enregistrement des erreurs, nous sommes sur le point de résoudre tout)
Terminer les bases en fournissant la classe à votre
app.module
. Notez que vous n'avez pas encore écritCustomReuseStrategy
, mais elle doit aller de l'avant et deimport
dereuse-strategy.ts
tout de même. Aussiimport { RouteReuseStrategy } from '@angular/router';
La pièce finale est l'écriture de la classe qui permettra de contrôler si oui ou non les routes se détachent, le stockage, la récupération, et remis en place. Avant de nous rendre à la vieille copier/coller, je vais faire une courte explication de la mécanique, ici, comme je les comprends. De référence le code ci-dessous pour la méthode dont je parle, et bien sûr, il y a beaucoup de documentation dans le code.
shouldReuseRoute
incendies. Celui-ci est un peu bizarre pour moi, mais si elle renvoietrue
, puis il réutilise en fait la voie que vous êtes actuellement sur et aucune des autres méthodes sont licenciés. Je viens de retourner false si l'utilisateur de naviguer à l'extérieur.shouldReuseRoute
retournefalse
,shouldDetach
incendies.shouldDetach
détermine si oui ou non vous voulez stocker la route, et renvoie unboolean
indiquant autant. C'est là que vous devez décider de magasin/de ne pas stocker des chemins, qui, je le ferais par la vérification d'un tableau de chemins voulez stockées contreroute.routeConfig.path
, et en renvoyant false si lapath
n'existe pas dans le tableau.shouldDetach
retournetrue
,store
est déclenché, ce qui est une occasion pour vous de stocker toutes les informations que vous souhaitez sur la route. Quoi que vous fassiez, vous aurez besoin de stocker lesDetachedRouteHandle
parce que c'est ce Angulaire utilise pour identifier votre stockées composant plus tard. Ci-dessous, je stocke à la fois lesDetachedRouteHandle
et laActivatedRouteSnapshot
dans une variable locale à ma classe.Donc, nous avons vu que la logique pour le stockage, mais ce que sur la navigation à un composant? Comment Angulaire décider d'intercepter votre navigation et de mettre le stockés un à sa place?
shouldReuseRoute
a retournéfalse
,shouldAttach
fonctionne, ce qui est votre chance de comprendre si vous voulez régénérer ou utiliser le composant dans la mémoire. Si vous souhaitez réutiliser un composant, retourtrue
et vous êtes bien sur votre chemin à!DetachedRouteHandle
deretrieve
.Qui est à peu près tout de la logique dont vous avez besoin! Dans le code de
reuse-strategy.ts
, ci-dessous, j'ai aussi laissé un chouette fonction qui permettra de comparer les deux objets. Je l'utilise pour comparer l'avenir de l'itinéraireroute.params
etroute.queryParams
avec celui stocké de l'. Si ceux qui correspondent à tous, je veux utiliser la stockées composant au lieu d'en générer un nouveau. Mais comment vous faites c'est à vous!de réutilisation de la stratégie.ts
Comportement
Cette mise en œuvre magasins de chaque voie unique que l'utilisateur visite sur le routeur exactement une fois. Cela permettra de continuer à ajouter des composants stockés en mémoire tout au long de la session de l'utilisateur sur le site. Si vous souhaitez limiter les itinéraires que vous stockez, l'endroit pour le faire est le
shouldDetach
méthode. Il contrôle les itinéraires que vous enregistrez.Exemple
Dire que votre utilisateur cherche quelque chose à partir de la page d'accueil, qui accède à la voie
search/:term
, ce qui peut apparaître commewww.yourwebsite.com/search/thingsearchedfor
. La page de recherche contient un tas de résultats de recherche. Vous aimeriez conserver cette route, dans le cas où ils veulent revenir à elle! Maintenant, ils cliquent sur un résultat de recherche et obtenir naviguéview/:resultId
, qui vous ne pas souhaitez stocker, de voir comme ils vont probablement être là qu'une seule fois. Avec la mise en place, je voudrais simplement changer leshouldDetach
méthode! Voici à quoi il pourrait ressembler:Tout d'abord nous allons faire un tableau de chemins que nous voulons pour stocker.
maintenant, dans
shouldDetach
, nous pouvons vérifier l'route.routeConfig.path
à l'encontre de notre tableau.Car Angulaire sera seulement stocker une instance d'un itinéraire, ce stockage sera léger, et nous allons stocker le composant situé à
search/:term
et pas tous les autres!Des Liens Supplémentaires
Bien qu'il n'y a pas beaucoup de documentation là-bas encore, voici quelques liens à ce qui n'existe pas:
Angulaire Docs: https://angular.io/docs/ts/latest/api/router/index/RouteReuseStrategy-class.html
Intro De L'Article: https://www.softwarearchitekt.at/post/2016/12/02/sticky-routes-in-angular-2-3-with-routereusestrategy.aspx
shouldDetach(route: ActivatedRouteSnapshot): boolean { if (route.url.length > 1) { return false; //not stored } else { return true; //stored } }
. Ne serait-ce pas suffisant pour résoudre mon problème?shouldDetach
est en effet le lieu où vous devez prendre la décision sur l'enregistrement de votre itinéraire. La mise en œuvre, vous avez au-dessus de stocker uniquement le chemin d'accès racine, puisque c'est le chemin d'accès pour lerouter.url.length
array = 0. Je voudrais choisir un chemin d'accès que vous souhaitez stocker ou à un ensemble de chemins d'accès que vous souhaitez stocker, et vérifiez le chemin d'accès à l'encontre de ce tableau à l'aide deforEach
et laroute.routeConfig.path
de la propriété. Je vais revenir et modifier ma réponse afin de mieux répondre à votre question.shouldDetach
et laacceptedRoutes
tableau à partir de la nouvellement ajoutée exemple?Observable
. Le composant en question doit s'abonner à laObservable
au cours de langOnInit
cycle de vie du crochet. Ensuite, vous serez en mesure de dire le composant, à partir de laReuseRouteStrategy
, qu'il a juste été fixé, et le composant peut modifier son état de forme.shouldDetach(route: ActivatedRouteSnapshot): boolean { if (route.url.length > 1) { return false; //not stored } else { return true; //stored } }
je vais cependant vous donner un crédit pour une explication approfondie de la classe. @shaahin pouvez-vous utiliser mon code pour résoudre votre problème?route.routeConfig.path
. Soit ça, ou une conception plus complexe de la manipulation que de la logique. Le système actuel permet au routeur de tenter de la fixation d'un parent de l'enfant de la route à la place d'un enfant différent de l'itinéraire, qui génère l'erreur.shouldAttach
etshouldDetach
logique. Je pense que le Routeur nous avons affaire ici est un peu plus complexe que needbe, mais essentiellement, il suffit d'écrire une interface pour le peler en dehors et prendre une meilleure décision sur ce qui à se détacher et à stockerRouteReuseStrategy
API est marqué Expérimentales. Il pourrait être retiré ou voir une rupture significative des changements dans un avenir Angulaire de la libération.Cannot reattach ActivatedRouteSnapshot created from a different route
erreur?Ne pas être intimidé par le a accepté de répondre, c'est assez simple. Voici une réponse rapide ce dont vous avez besoin. Je recommande au moins la lecture de la accepté de répondre, comme il est plein de beaucoup de détails.
Cette solution n'est pas n'importe quel paramètre de comparaison comme la accepté de répondre, mais il fonctionne parfaitement pour le stockage d'un ensemble de routes.
app.le module.ts importations:
partagé/routage.ts:
À utiliser Chris Fremgen de la stratégie avec paresseusement les modules chargés, modifier CustomReuseStrategy classe à la suivante:
enfin, dans votre fonctionnalité des modules de routage de fichiers, définir vos clés:
Plus d'infos ici.
route.data["key"]
de construire sans erreur. Mais la question que je vais avoir, c'est que j'ai un itinéraire+composant qui est utilisé dans deux endroits différents.1. sample/list/item
et2. product/id/sample/list/item
quand j'ai la charge, soit de la des chemins qu'il charge très bien, mais l'autre lève le rattachée erreur parce que je suis le stockage basé surlist/item
Donc, mon travail est environ j'ai dupliqué la route et fait un peu de changement pour le chemin de l'url mais en affichant le même composant. Vous ne savez pas si il y a un autre travail autour de cela.la suite est du travail! référence:https://www.cnblogs.com/lovesangel/p/7853364.html
JS:
_routerState
._routerState
cause aucun tort ?deleteRouteSnapshot
?En plus de la accepté de répondre (par Corbfon) et Chris Fremgen la plus courte et la plus simple explication, je veux ajouter plus de souplesse dans la manipulation des routes qui doivent utiliser la stratégie de réutilisation.
Les deux réponses stocker les routes que nous voulons cache dans un tableau et ensuite, vérifiez si la route est dans le tableau ou non. Ce contrôle est effectué dans
shouldDetach
méthode.Je trouve cette approche inflexible, parce que si nous voulons changer le nom de la route, nous aurions besoin de n'oubliez pas aussi de changer le nom de la route dans notre
CustomReuseStrategy
classe. Nous pouvons oublier de le changer ou de quelque autre développeur au sein de notre équipe peut décider de changer le nom de la route même pas connaître l'existence deRouteReuseStrategy
.Au lieu de stocker les routes que nous voulons cache dans un tableau, on peut marquer directement dans
RouterModule
à l'aide dedata
objet. De cette manière, même si nous changeons le nom de la route, la stratégie de réutilisation serait encore appliquée.Puis dans
shouldDetach
méthode me faire une utilisation de ce.