web-dev-qa-db-fra.com

backbone.js définit la propriété du tableau de modèles

J'ai un modèle backbone.js avec un tableau comme 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.

38
fortuneRice

la syntaxe que vous essayez ne fonctionne pas car les paramètres envoyés dans la méthode set sont un littéral d'objet. les valeurs sur le côté gauche de: sont traitées comme des noms littéraux, tandis que les valeurs sur la droite peuvent être exécutées/interprétées du code.

il y a quelques choses que vous pouvez faire, cependant:

obtenir, mettre à jour et définir l'ensemble du tableau:

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

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

l'avantage de procéder de cette façon est que vous obtenez les événements de "changement" standard déclenchés à partir du modèle car vous définissez la valeur de l'attribut sur le modèle.

une autre façon de le faire serait de raccourcir le processus en utilisant un get 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 cela ne déclenchera pas les événements "change" car vous n'appelez pas la méthode set. donc, si vous avez besoin de ces événements, vous devez les déclencher vous-même, comme je l'ai montré.

69
Derick Bailey

La réponse de Derick est généralement correcte à part une chose. L'obtention et la définition d'une propriété de tableau ne généreront pas les événements de modification sur le modèle.

L'appel get vous donne une référence au tableau dans la propriété "myArray", que vous modifiez ensuite. Parce que vous avez une référence à un objet, vous modifiez directement le même tableau que sur votre modèle. Lorsque vous appelez ensuite "set", l'objet que vous passez est exactement égal au tableau pour cette propriété (car ils sont tous deux des références au même objet), et aucun changement n'est détecté car il y a aucun changement dans l'opération réglée.

Pour déclencher un événement de modification, vous devez toujours l'appeler manuellement (comme dans le deuxième exemple de Derick), ou créer un clone du tableau et l'utiliser dans votre setter (car il s'agit désormais d'un objet complètement différent).

58
Ian Garrison