Tengo una pregunta simple sobre las funciones get y set de Backbone.js .
1) Con el siguiente código, ¿cómo puedo 'obtener' o 'configurar' obj1.myAttribute1 directamente?
Otra pregunta:
2) En el modelo, además del objeto de valores predeterminados , ¿dónde puedo / debo declarar los otros atributos de mi modelo, de modo que se pueda acceder a ellos a través de los métodos get y set de Backbone?
var MyModel = Backbone.Model.extend({
defaults: {
obj1 : {
"myAttribute1" : false,
"myAttribute2" : true,
}
}
})
var MyView = Backbone.View.extend({
myFunc: function(){
console.log(this.model.get("obj1"));
//returns the obj1 object
//but how do I get obj1.myAttribute1 directly so that it returns false?
}
});
Sé que puedo hacer:
this.model.get("obj1").myAttribute1;
pero ¿es una buena práctica?
javascript
backbone.js
backbone-model
fortuna arroz
fuente
fuente
defaults
(obj1 en este caso), ese mismo objeto se compartirá en todas las instancias del modelo. La práctica actual es definirdefaults
como una función que devuelve un objeto para ser utilizado como predeterminado. backbonejs.org/#Model-defaults (ver la nota en cursiva)Respuestas:
Si
this.model.get("obj1").myAttribute1
bien está bien, es un poco problemático porque podría tener la tentación de hacer el mismo tipo de cosas para el conjunto, es decirPero si hace esto, no obtendrá los beneficios de los modelos Backbone
myAttribute1
, como eventos de cambio o validación.Una mejor solución sería nunca anidar POJSO ("objetos JavaScript antiguos y simples") en sus modelos y, en su lugar, anidar clases de modelos personalizadas. Entonces se vería algo como esto:
Entonces el código de acceso sería
pero lo que es más importante, el código de configuración sería
que desencadenará eventos de cambio apropiados y similares. Ejemplo de trabajo aquí: http://jsfiddle.net/g3U7j/
fuente
Uncaught TypeError: Object #<Object> has no method 'set'
Backbone.Model
, y luego comienzan a generar eventos mágicos.Creé backbone-deep-model para esto: simplemente extienda Backbone.DeepModel en lugar de Backbone.Model y luego puede usar rutas para obtener / establecer atributos de modelo anidado. También mantiene eventos de cambio.
fuente
//You can use index notation to fetch from arrays console.log(model.get('otherSpies.0.name')) //'Lana'
La solución de Domenic funcionará, sin embargo, cada nuevo MyModel apuntará a la misma instancia de Obj. Para evitar esto, MyModel debería verse así:
Consulte la respuesta de c3rin @ https://stackoverflow.com/a/6364480/1072653 para obtener una explicación completa.
fuente
Yo utilizo este enfoque.
Si tiene un modelo Backbone como este:
Puede establecer el atributo "ab" con:
Ahora su modelo tendrá atributos como:
con el evento "cambiar" activado.
fuente
meta2= m.get('x'); meta2.id=110; m.set('x', meta2)
. Esto no desencadena ningún evento de cambio para mí :(_.clone(m.get('x'))
. graciassetting
con el objeto que estágetting
en el momento establecido. Entonces, si no clona los dos objetos, los dos objetos que se comparan son exactamente iguales en el momento establecido.Hay una solución en la que nadie ha pensado todavía y que es muy útil. De hecho, no puede establecer atributos anidados directamente, a menos que use una biblioteca de terceros que probablemente no desee. Sin embargo, lo que puede hacer es hacer un clon del diccionario original, establecer la propiedad anidada allí y luego configurar todo el diccionario. Pedazo de pastel.
fuente
Tuve el mismo problema que @pagewil y @Benno con la solución de @ Domenic. Mi respuesta fue en su lugar escribir una subclase simple de Backbone.Model que solucione el problema.
Lo que NestedModel hace por usted es permitir que funcionen (que es lo que sucede cuando myModel se configura a través de datos JSON):
Sería fácil generar la lista de modelos automáticamente al inicializar, pero esta solución fue lo suficientemente buena para mí.
fuente
La solución propuesta por Domenic tiene algunos inconvenientes. Digamos que quiere escuchar el evento "cambiar". En ese caso, el método 'initialize' no se activará y su valor personalizado para el atributo se reemplazará con el objeto json del servidor. En mi proyecto me enfrenté a este problema. Mi solución para anular el método 'establecer' del modelo:
fuente
Si bien en algunos casos el uso de modelos Backbone en lugar de atributos de objeto anidados tiene sentido como mencionó Domenic, en casos más simples, podría crear una función de establecimiento en el modelo:
fuente
Si interactúa con el backend, lo que requiere un objeto con estructura de anidamiento. Pero con backbone más fácil de trabajar con estructura lineal.
backbone.linear puede ayudarte.
fuente