7
votes

Utilisez des sous-traitants.js "Cublication" sur un tableau observable

J'ai un tableau observable d'objets et je veux cueillir les valeurs à l'aide de sous-traitants.js

par exemple: xxx

et je veux juste cueillir le Valeurs à l'intérieur de l'objet plutôt que l'ensemble observable.

Puis-je faire cela avec une seule commande?

J'ai essayé:

_. Cruck (myarray (), "id ()") et _. Cublication (myarray (), "id" ())

mais ces rendez-vous indéfini et "ID n'est pas une fonction" respectivement.

merci!


0 commentaires

4 Réponses :


2
votes

J'ai pu résoudre ceci en utilisant la fonction "Carte":

_.map(myArray(), function(item) {return item.id()});


1 commentaires

S'il vous plaît voir ma réponse. Ce que vous cherchiez était _. Invoquer



2
votes

parce que nom code> est une fonction, que diriez-vous de PLUCK code> Votre tableau d'origine dans une matrice de fonctions, puis en utilisant ko.tojs code> pour le convertir dans une matrice à cordes?

var myArray = ko.observableArray([{
    id: ko.observable(1),
    name: ko.observable("name1")
},
{
    id: ko.observable(2),
    name: ko.observable("name2")
}]);

var names = _.pluck(myArray(), 'name');
console.log(ko.toJS(names)); // Output: ["name1", "name2"]


0 commentaires

4
votes

Réponse courte

Utilisez _. Invoquez au lieu de _. Cublication

Voir cet échantillon violon .

réponse longue

_. Cublication (liste, propriété) fonctionne comme documenté:

Une version pratique de ce qui est peut-être le cas d'utilisation le plus courant pour la carte: extraire une liste de valeurs de propriété.

ou, comme étant mieux exallé sur Lodash Docs: _. Cupling (collection, chemin)

Obtient la valeur de la propriété du chemin de tous les éléments de la collection.

Donc, si vous faites ceci: xxx

Ce que vous obtenez est une matrice avec tous les ID Et tous ces ID sont observables, comme dans les objets du tableau d'origine

mais vous pouvez utiliser _. Invoke (Liste, MethodName, * Arguments) , qui, comme documenté:

appelle la méthode nommée par MethodName sur chaque valeur de la liste. Tous les arguments supplémentaires passés à invoquer seront transmis à l'invocation de la méthode.

ou, sur la version de Lodash _. Invoke (collection, chemin, [args])

invoque la méthode sur Chemin sur chaque élément de la collecte, renvoyant un tableau des résultats de chaque méthode invoquée. Tous les arguments supplémentaires sont fournis à chaque méthode invoquée. Si MethodName est une fonction, elle est appelée, et ceci à chaque élément de la collecte.

De cette façon, vous exécutez chaque observable et obtenez sa valeur comme prévu: xxx

Mind the ViewModels pleins d'observables! < p> Le premier commentaire à cette question m'a fait comprendre cet avis:

La meilleure solution utilise ko.tojs pour convertir tous les observables dans un modèle de vue en javascript régulier objet, avec des propriétés régulières. Une fois que vous l'avez fait, un soulignement ou une autre bibliothèque, fonctionnera comme prévu.

Le _. Invoke ne fonctionne que pour un seul niveau d'observable, comme ce cas. S'il y avait plusieurs niveaux d'observables imbriqués, il échouera complètement, car il appelle une fonction à la fin du chemin, pas à chaque étape du chemin, par exemple, _. Invoquer ne serait pas Travaillez pour ce cas: xxx

Dans ce cas, vous ne pouvez utiliser que _. Invoquer au premier niveau, comme celui-ci: xxx

mais cela ne fonctionnerait pas: xxx

dans cet appel, seul nom serait invoqué, Mais personne non, cela échouerait, car personne est observable, il n'a donc pas de propriété nom

note: Lodash est une autre bibliothèque similaire et principalement compatible avec le soulignement, mais mieux dans certains aspects < / em>


4 commentaires

_. invoquer fonctionne mais n'est pas idiomatique - et il fait des hypothèses sur la nature du contenu de la matrice à ce sujet. Si ID n'était pas observable que vous devriez changer l'appel entier. Si l'entier argument était une variable dans laquelle vous ne pouviez pas prédire si cela se référerait à un observable ou non, alors en utilisant invoke ne fonctionnerait pas du tout. @ Les solutions de CASEYWEBB et @MOUHONG LIN utilisant ko.tojs () sont meilleures car elles sont idiomatiques, immédiatement évidentes pour le lecteur et stable.


Je suis entièrement d'accord avec vous. ko.tojs est le seul moyen de convertir un modèle de vue en un objet JavaScript "normal". Une fois que cela est fait, vous pouvez utiliser les fonctions de soulignement de manière normale. Je comprends les implications des observables imbriqués, ce qui ferait cela échouer. Je mette à jour ma réponse.


J'aime l'explication et les exemples que vous avez fournis, j'ai donc choisi cette réponse, mais que vous êtes arrivé à la même conclusion qu'une autre affiche qui a répondu d'abord, j'ai été confrontée à la réponse à choisir. Si cela est incorrect, faites-moi savoir et je vais changer cela. Je suis un Lurker de longue date, mais nouveau pour poser des questions. :)


Eh bien, parfois il est difficile de choisir quelle est la meilleure réponse. Je ne peux pas vous aider avec ça. Essayez simplement de penser à quelle réponse serait le meilleur pour quelqu'un avec le même problème et le choisir. Choisissez la qualité de l'explication et, en cas de doute, celui qui a répondu en premier. C'est à vous. RMemeber que le but est d'aider les gens, alors faites ce que vous pensez pouvoir être plus utile pour les autres personnes.



1
votes

Déballez-le d'abord

_.pluck(ko.toJS(myArray), 'id')

_(ko.toJS(myArray)).pluck('id)


0 commentaires