6
votes

Knockoutjs: mise à jour / insérer des données dans une vue de vue à l'aide de la cartographie

J'ai essayé de comprendre cela pendant un certain temps maintenant. Je n'ai pu trouver rien qui répond à ce problème, mais s'il vous plaît corriger-moi si je me trompe.

Le problème: J'ai des données d'une API JSON à venir, avec une structure de matrice / objet imbriquée. J'utilise la mappage pour remplir initialement le modèle avec mes données. Pour mettre à jour cela, je souhaite étendre le modèle si de nouvelles données arrivent ou mettent à jour les données existantes.

Autant que j'ai découvert, la clé d'option de mappage doit faire ce tour pour moi, mais j'aurais peut-être mal compris la fonctionnalité des options de mappage.

J'ai fait bouillir Le problème à représenter par cet exemple: xxx

violon: http://jsfiddle.net/mikaelbr/gdja7/gdja7/

Comme vous pouvez le constater, la première ligne insère les données. Tout bon. Mais quand j'essaie de mettre à jour, il remplace le contenu. La même chose pour la troisième cartographie; Il remplace le contenu, au lieu de l'exercer.

suis-je en train d'utiliser le problème? Devrais-je essayer d'étendre le contenu "manuellement" avant d'utiliser la cartographie?

Modifier la solution:

J'ai résolu ce cas en ayant un deuxième réseau d'assistance stockant tous les modèles actuels. Sur les nouvelles données, j'ai étendu ce tableau et j'ai mis à jour le modèle d'affichage pour contenir les éléments accumulés.

sur la mise à jour (dans mon cas, un message WebSocket), j'ai bouclé dans les modèles, modifié le contenu de l'élément en question et la valeur de la méthode utiliséeHasmutate () pour donner une notification de la valeur modifiée à la liberté Lib.


0 commentaires

3 Réponses :


0
votes

Oui, vous devez d'abord collecter toutes les données dans une liste ou une matrice, puis appliquer le mappage sur cette liste. Sinon, vous allez écraser les valeurs dans votre viewModel.


0 commentaires

1
votes

Vous pouvez utiliser ko.mapping.updatedromjs () pour mettre à jour les valeurs existantes. Cependant, cela n'ajoute pas de nouvelles valeurs afin que ce soit un problème dans votre cas. Jetez un coup d'œil au lien ci-dessous pour plus de détails.

Utiliser Updeckfromjs remplace les valeurs quand il devrait être les ajoutant


1 commentaires

La méthode UpdateFromjs () a été supprimée en août 2011. Github.com/stevesanderson/knockout.mapping / commit / ...



4
votes

En regardant votre code exemple, le plugin de mappage se comporte exactement comme je l'attends. Lorsque vous appelez fromjs sur une collection, vous racontez efficacement le plug-in de mappage, il s'agit du nouveau contenu de cette collection. Par exemple:

sur la deuxième ligne, comment pourrait-il savoir si vous avez mis à jour ou si vous aviez simplement supprimé ID: 2?

Je ne trouve aucune mention d'une méthode appropriée qui traite les données comme une seule mise à jour, bien que vous puissiez en ajouter un. Les tableaux mappés sont livrés avec des méthodes utiles telles que mappedindexof pour vous aider à trouver des éléments particuliers. Si vous recevez un ensemble de données de mise à jour, sélectionnez simplement la boucle, trouvez l'élément et mettez-le à la mettre à jour avec un appel de mappage.Fromjs à cet élément particulier. Cela peut facilement être généralisé en méthode réutilisable.


1 commentaires

Toute réflexion sur ceci: Stackoverflow.com/Questions/20397054/...