backbone.js establece la propiedad de matriz de modelo
(2)
Tengo un modelo backbone.js con una matriz como una propiedad:
defaults: {
myArray : [0,1,2]
}
Estoy tratando de establecer el valor de un índice en particular.
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
¿Cuál es la sintaxis correcta para obtener / establecer propiedades de matriz? Gracias.
La respuesta de Derick es en su mayoría correcta, aparte de una cosa. Obtener y luego establecer una propiedad de matriz no generará los eventos de cambio en el modelo.
La llamada a obtener le da una referencia a la matriz en la propiedad "myArray", que luego modifica. Como tiene una referencia a un objeto, está modificando directamente la misma matriz que en su modelo. Cuando llamas a "set", el objeto que estás pasando es exactamente igual a la matriz para esa propiedad (porque ambas son referencias al mismo objeto), y no se detectan cambios porque no hay cambios en la operación de configuración.
Para activar un evento de cambio, igual debe llamarlo manualmente (como en el segundo ejemplo de Derick) o crear un clon de la matriz y usarlo en su setter (ya que ahora es un objeto completamente diferente).
la sintaxis que está intentando no funciona porque los parámetros enviados al método set son un objeto literal. los valores en el lado izquierdo de: se tratan como nombres literales, mientras que los valores de la derecha se pueden ejecutar / interpretar código.
Sin embargo, hay algunas cosas que puedes hacer:
obtener, actualizar y configurar toda la matriz:
var a = myModel.get("myArray");
a[0] = 5
myModel.set("myArray", a);
myModel.get("myArray"); //=> [5, 1, 2]
la ventaja de hacerlo de esta manera es que obtiene los eventos de "cambio" estándar disparados desde el modelo porque está configurando el valor del atributo en el modelo.
Otra forma de hacerlo sería atajar el proceso usando un get y actualizando la matriz directamente:
myModel.get("myArray")[0] = 5
myModel.trigger("change");
myModel.trigger("change:myArray");
myModel.get("myArray"); //=> [5, 1, 2]
la desventaja aquí es que esto no activará los eventos de "cambio" porque no está llamando al método de configuración. entonces, si necesita esos eventos, tiene que dispararlos usted mismo, como lo he demostrado.