38 votes

backbone.js set, propriété de tableau modèle

J'ai un modèle backbone.js avec un tableau en tant que propriété:

 defaults: {
    myArray : [0,1,2]
}
 

J'essaie de définir la valeur d'un index particulier.

 var myIndex = 1;
myModel.set({"myArray"[myIndex] : newVal}); //doesn't work
myModel.set({"myArray[myIndex]": newVal}); //doesn't work
myModel.set({"myArray" + "[" + myIndex + "]": newVal}); //doesn't work
 

Quelle est la syntaxe appropriée pour obtenir / définir les propriétés d'un tableau? Merci.

69voto

Derick Bailey Points 37859

la syntaxe que vous essayez ne fonctionne pas parce que les paramètres envoyés dans l'ensemble de la méthode est un objet littéral. les valeurs sur le côté gauche de l' : sont traités comme des littérale des noms, alors que les valeurs de la droite peut être exécuté / code interprété.

il ya quelques choses que vous pouvez faire, cependant:

obtenir, mise à jour, et de définir l'ensemble de la matrice:

var a = myModel.get("myArray");
a[0] = 5
myModel.set("myArray", a);

myModel.get("myArray"); //=> [5, 1, 2]

l'avantage de cette façon de faire est que vous obtenez la norme "changer" les événements déclenchés à partir du modèle parce que vous êtes à la définition de la valeur de l'attribut dans le modèle.

une autre façon de faire serait de raccourci le processus en utilisant un obtenir et de mettre à jour le tableau directement:

myModel.get("myArray")[0] = 5
myModel.trigger("change");
myModel.trigger("change:myArray");

myModel.get("myArray"); //=> [5, 1, 2]

l'inconvénient ici est que ce ne sera pas le feu à la "modification" des événements parce que vous n'êtes pas à l'appel de la méthode de jeu. donc, si vous avez besoin de ces événements, vous devez le feu vous-même, comme je l'ai montré.

58voto

Ian Garrison Points 509

Derick la réponse est la plupart du temps correct à part une chose. D'obtenir et de définir ensuite un tableau de la propriété ne sera pas générer les événements de changement sur le modèle.

La obtenir de l'appel vous donne une référence à la matrice de dans la "montableau" de la propriété, que vous pouvez ensuite modifier. Parce que vous avez une référence à un objet, vous êtes en modifiant directement le même tableau que sur votre modèle. Lorsque vous appelez "set"," l'objet que vous êtes en passant est exactement égale à la matrice de cette propriété (parce qu'ils sont à la fois des références pour le même objet), et le changement est détecté, car il n'y a pas de changement dans l'ensemble de l'opération.

Pour déclencher un événement de changement, vous pouvez toujours appeler manuellement (comme dans Derick deuxième exemple), ou de créer un clone de la matrice et de l'utiliser dans votre setter (puisque c'est maintenant un tout autre objet).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X