obtenir seul élément de ngrx/magasin
J'ai écrit la suite de réducteur pour stocker l'état des éléments dans mon Angulaire 2 app. Les Éléments sont des offres de prix pour les Instruments Financiers (par exemple les stocks de devises).
Mon Réducteur de mise en Œuvre est comme suit:
export const offersStore = (state = new Array<Offer>(), action:Action) => {
switch(action.type){
case "Insert":
return [
...state, action.payload
];
case "Update":
return state.map(offer => {
if(offer.Instrument === action.payload.Instrument)
{
return Object.assign({}, action.payload);
}
else return offer;
});
case "Delete":
return state.filter(offer => offer.Instrument !== action.payload )
default:
return state;
}
}
J'ai réussi à obtenir des Insertions, des Mises à jour et Suppressions de travail - même si ce n'était pas facile. Je trouve Redux être quelque chose d'un changement de paradigme de la façon dont j'ai été codant pour des années.
J'ai un Instrument Composant/Page sur mon App qui montre toutes les informations disponibles pour un Instrument en particulier, indiqué par InstrumentId par exemple "EUR/USD" (stockée dans la charge utile.Instrument de la propriété).
Mon problème est que je ne suis pas sûr de savoir comment chercher efficacement un instrument spécifique et la saisir à partir de la boutique. Non seulement cela, mais je veux aussi l'instrument que j'ai récupérer pour être mis à jour si l'Instrument dans le magasin est mis à jour car ils sont fréquemment via websocket pousser à partir du serveur. Donc j'ai vraiment besoin de rechercher le magasin pour un instrument spécifique, et de le retourner comme un fait Observable, qui continuera à mettre à jour la Vue de Composant en fonction de nouvelles données qui est poussé vers le magasin.
Comment puis-je y parvenir?
Ces réagir/redux exemples porté sur l'utilisation ngrx/magasin pourrait aider un peu aussi. github.com/btroncone/ngrx-examples
Ils sont essentiellement de construire des indices de contre l'état. const newBookEntities = newBooks.réduire((entités: { [id: string]: Livre }, livre: Livre) => { Objet de retour.attribuer(entités, { [livre.id]: livre }); }, {});
Et puis utiliser cette carte d'identité pour entrer directement à l'objet. état$ .sélectionnez(s => s.les entités[id]);
A cette aide?
OriginalL'auteur reach4thelasers | 2016-08-15
Vous devez vous connecter pour publier un commentaire.
Ce que vous n'obtenez pas, c'est que pour chaque action, qui est appelé à un réducteur, le nouvel état est retourné.
À partir de votre code d'exemple dans la question, votre état est juste une liste d'instruments.
Il n'y a pas d'index, de sorte que la seule façon de vérifier si l'instrument est dans la liste est à la recherche de l'ensemble de la liste.
Mais que faire si votre état est un dictionnaire? En outre, si vous avez gardé une liste des index séparé pour le dictionnaire?
votre état est de type ce:
Chaque fois qu'une action est exécutée, le nouvel état est retourné. C'est un concept important dans Redux, parce que l'état ne peut jamais être muté directement. Vous êtes en fait le mieux l'application stricte de cette lorsque vous composez votre réducteur: (dire que vous avez vous "offre réducteur" et un autre réducteur, à vous de les combiner pour composer:
Il est facile de faire les choses mal dans Redux - mais à l'aide de storeFreeze va lancer un message d'erreur si vous essayez à la mutation de l'état directement. Le point est que les actions de changement d'état, et de faire un nouvel état. Ils ne changent pas l'état existant - il nous permet de undo/redo... etc.
À l'aide de votre exemple ci-dessus, je voudrais utiliser ce que mon Offre est réducteur:
noter que des modifications sont apportées à un état temporaire par l'objet.attribuer (deep copy) et puis le nouvel état est retourné.
L'autre réponse à la question était un peu confus. Il est allé dans le détail de la façon de combiner les différents réducteurs, mais il n'a pas beaucoup de sens pour moi.
dans votre réducteurs/index.ts, vous devriez avoir un type:
à l'intérieur de cet indice.ts, vous devriez avoir les fonctions qui obtiennent les réducteurs:
à l'intérieur de notre offerReducer et notre otherReducer, nous définissons les fonctions qui permet d'interroger les données dont nous avons besoin. Ce sont des fonctions anonymes, qui ne sont liés à rien à l'heure actuelle, mais nous lien plus tard (à la getReducerFunctions).
des exemples de ces fonctions:
cela ne fait rien. à moins que nous l'appliquer à certaines données utiles (par exemple, la offersRedeucer) que nous avons fait plus tôt, et nous combinons les deux comme ceci:
J'ai essayé d'anticiper le prochain problème que vous ferez face (un deuxième réducteur) ainsi que de répondre à la question "comment obtenez-vous une question?", comme je sais, vous allez tomber sur cette question à beaucoup. Mais ne vous laissez pas vous confondre avec l'original de votre requête.... L'astuce pour trouver un élément, est pour le maintien d'un état qui est une carte d'articles (un dictionnaire) - jamais de la mutation de l'etat et de toujours revenir à un état nouveau. Suivre cette orientation et votre problème est résolu. Le prochain problème que vous ferez face à de multiples réducteurs, mais lire de nouveau au-dessus et il doit faire sens.
Je suis en désaccord avec la réponse précédente sur stackoverflow questions - ils sont tout ce que vous besoin pour être. Et si vous avez besoin d'un tutoriel, alors ils peuvent être un tutoriel. Et je ne pense pas que ce soit une mauvaise chose, surtout dans le créneau des sujets comme la RXJS où peu de conseils et de la documentation est disponible.
Merci de mettre un bounty sur cette question - j'espère que je vous ai donné une meilleure réponse. D'autres questions - juste à crier. Je suis heureux de vous aider. Vous ne serez pas obtenir un "je suis réticent à répondre à toutes vos questions" de moi... je suis là pour vous aider - ne pas insulter.
TBH votre réponse m'a aidé à résoudre mon problème @wiredprogrammer - mais cette réponse était plus détaillé et pour être honnête, vous étiez un peu de cul sur mes questions... j'ai Donc reçu la prime à celui-ci.
Plus détaillée? Peut-être qu'il a réussi à se concentrer sur la partie que vous n'étiez pas comprendre mieux, mais il a rappelé beaucoup de ce que j'avais déjà écrit.
Ce n'est pas grave en fin de compte. Je suis content que vous avez obtenu la réponse que vous avez cherché. Je n'ai pas vraiment obtenir ce qu'il vous a dit que je ne l'ai pas mais comme je l'ai dit il y a une opinion aspect marquant une réponse et je vais le respecter.
mais vous avez répondu à votre propre question
OriginalL'auteur reach4thelasers
Bon, je vais donner un coup de feu à expliquer une façon de mettre en place et, espérons le faire dans une manière que vous et d'autres personnes peuvent comprendre.
Donc, si vous stockez un tableau d'objets et de la nécessité d'obtenir l'accès à une ligne par une certaine id de la clé ou alors la façon dont le ngrx exemple d'application montre que vous pouvez faire est de créer un objet contenant votre objet à utiliser (dans le cas de leur livre app) le livre de l'id comme clé de propriété. Vous pouvez définir n'importe quelle chaîne de caractères comme un nom de propriété. Donc, dire que vous avez votre état d'une propriété appelée "entités" dont la valeur est un objet vide. Vous pouvez alors prendre votre tableau et créer des propriétés sur les "entités" de l'Objet.
Permet de commencer avec juste une ligne dans le tableau de réserver des objets. Pour ajouter cette ligne à la "entités" objet de vous le faire de cette façon.
Permettra de faire le livre d'identification d'une propriété sur les "entités" objet.
Si vous étiez à inspecter dans la console ou les outils de débogage, il peut ressembler après sa création.
La ngrx exemple d'application fonctionne sur toute la gamme pour l'ajouter à l'état à l'aide de la réduire opérateur sur le tableau javascript.
Et de créer ensuite des fonctions spéciales pour obtenir des pièces de cet état, qui peut être composé ensemble plus tard pour obtenir les lignes vous avez besoin
Et ils composent dans l'index.ts baril dans l'exemple
Cette fonction de la chaîne de l'ensemble des appels allant de droite à gauche. Le premier appel getBooksState pour obtenir le réducteur de l'état, puis en appelant fromBooks.getBooks et en le passant dans le bookid que vous voulez et l'état de la précédente "getBooksState" et vous permettant de faire la cartographie de la sélection de membres dont vous avez besoin.
Dans votre composant, vous pouvez importer cette fonction et l'utiliser pour avoir les livres que vous voulez.
Cette retourné observable est mis à jour chaque fois que le store est mis à jour.
Ajouté: de Sorte que l'opérateur "laisser" sur l'objet banque de passe dans le courant observable holding de la banque d'état de l'objet à la fonction qui est retourné par la "getBooks" de la fonction.
Permet de regarder de plus près.
Deux fonctions sont transmis à la fonction compose ici -- fromBooks.getBooks(bookIds) et getBooksState(). La fonction permet de composer une valeur à être passé dans la première fonction sur le droit et que les fonctions de résultats transmis à la fonction sur la gauche et ainsi de suite et ainsi de suite. Dans ce cas, nous allons prendre les résultats de la fonction renvoyée par "getBooksState" et la passer dans la fonction renvoyée par la fonction "fromBooks.getBooks(bookIds)" et puis, finalement, de retour à ce résultat.
Ces deux fonctions dans un Observable. Dans le cas de la fonction renvoyée par getBooksState() prend comme paramètre le magasin de l'état de l'objet observé à partir de laquelle il sera de la carte/select (carte et sélectionnez sont des alias pour l'autre) pour la tranche de la boutique, nous nous soucions et le retour de la mappé observables. Que mappé observables sera passé dans la fonction retourné à partir de la fromBooks.getBooks(bookIds) de la fonction. Cette fonction attend de l'état de la tranche observables. Cette fonction de la nouvelle cartographie en tirant uniquement les entités dont nous nous soucions. Cette nouvelle observable est ce qui est finalement renvoyé par la "boutique.laissez" appel.
Si vous avez besoin de plus de précisions alors s'il vous plaît poser des questions et je vais faire de mon mieux pour clarifier.
https://github.com/ngrx/example-app
C'est une déclaration de type de caractères d'imprimerie. Il dit simplement que les entités de l'objet devrait avoir les noms de propriété faite d'une chaîne de valeurs qui sont le livre d'objets ou de répondre le livre objet de l'interface. Il n'y a pas d'équivalence en JavaScript et lors de la compilation dans Tapuscrit ce ne sera pas le porter vers le bas pour le JavaScript. C'est seulement là pour peluchage le Tapuscrit de code pour s'assurer de son bon types sont passés dans l' (dans ce cas dans une fonction).
OK je vais y arriver!!! Quelques questions. La ce ne laissez faire dans cette.magasin.laissez - (getBooks())? Et les fonctions Spéciales pour obtenir le retour de l'état observables. Comment puis-je obtenir de l'état maintenant plutôt que d'attendre un changement de publier à l'Observable?
L'objet de la banque est dans son essence un BehaviorSubject ( sa part de RXJS) de sorte que tous vous avez à faire est de vous abonner pour obtenir la valeur actuelle. Le "laisser" sur le magasin est équivalent à la "je" de l'opérateur pour rxjs. github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/... La "je" de l'opérateur qui permet de travailler sur l'original de l'observable. Le magasin principal est essentiellement juste un simple objet javascript qui est enveloppé dans une observable. Donc dans ce cas c'est de passer une référence à la boutique observables à la fonction renvoyée par la fonction getBooks.
Si vous regardez getBooks il est de retour d'une fonction qui prend un état$ Observable en tant que paramètre. la fonction d'exportation getBooks(bookIds: string[]) { return (état$: Observables<BooksState>) => état$ .laissez - (getBookEntities()) .carte(entités => bookIds.carte(id => les entités[id])); }
OriginalL'auteur wiredprogrammer