J'ai un tableau observable d'objets et je veux cueillir les valeurs à l'aide de sous-traitants.js
par exemple: p> et je veux juste cueillir le Valeurs à l'intérieur de l'objet plutôt que l'ensemble observable. P> Puis-je faire cela avec une seule commande? p> J'ai essayé: p> mais ces rendez-vous indéfini et "ID n'est pas une fonction" respectivement. p> merci! p> p> _. Cruck (myarray (), "id ()") code> et
_. Cublication (myarray (), "id" ()) code> p>
4 Réponses :
J'ai pu résoudre ceci en utilisant la fonction "Carte":
_.map(myArray(), function(item) {return item.id()});
S'il vous plaît voir ma réponse. Ce que vous cherchiez était _. Invoquer code>
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"]
Utilisez Voir 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é. p>
blockQuote> ou, comme étant mieux exallé sur Lodash Docs: Obtient la valeur de la propriété du chemin de tous les éléments de la collection. P>
blockQuote> Donc, si vous faites ceci: p> Ce que vous obtenez est une matrice avec tous les mais vous pouvez utiliser 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. P>
blockquote> ou, sur la version de Lodash 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. P>
BlockQuote> De cette façon, vous exécutez chaque observable et obtenez sa valeur comme prévu: p> La meilleure solution utilise Le Dans ce cas, vous ne pouvez utiliser que mais cela ne fonctionnerait pas: p> dans cet appel, seul note: Lodash est une autre bibliothèque similaire et principalement compatible avec le soulignement, mais mieux dans certains aspects < / em> p> h2> _. Invoquez code> au lieu de
_. Cublication code> p>
réponse longue h2>
_. Cublication (liste, propriété) code> fonctionne comme documenté: p>
_. Cupling (collection, chemin) code> p>
ID code> Et tous ces
ID code> sont observables, comme dans les objets du tableau d'origine p>
_. Invoke (Liste, MethodName, * Arguments) code>, qui, comme documenté: p>
_. Invoke (collection, chemin, [args]) code> p>
Mind the ViewModels pleins d'observables! h2> < p> Le premier commentaire à cette question m'a fait comprendre cet avis: p>
ko.tojs code> 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. P>
_. Invoke code> 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 code> ne serait pas Travaillez pour ce cas: p>
_. Invoquer code> au premier niveau, comme celui-ci: P>
nom code> serait invoqué, Mais
personne code> non, cela échouerait, car
personne code> est observable, il n'a donc pas de propriété code> nom p>
_. invoquer code> fonctionne mais n'est pas idiomatique - et il fait des hypothèses sur la nature du contenu de la matrice à ce sujet. Si
ID code> n'était pas observable que vous devriez changer l'appel entier. Si l'entier code> argument code> é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 code> ne fonctionnerait pas du tout. @ Les solutions de CASEYWEBB et @MOUHONG LIN utilisant
ko.tojs () code> sont meilleures car elles sont idiomatiques, immédiatement évidentes pour le lecteur et stable.
Je suis entièrement d'accord avec vous. ko.tojs code> 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.
Déballez-le d'abord
_.pluck(ko.toJS(myArray), 'id') _(ko.toJS(myArray)).pluck('id)