2011-08-26 6 views
5

Al usar Backbone.js, he notado que tanto las vistas como los modelos reciben cids. Entiendo que si estas clases son parte de una colección, puedo extraer cualquiera de ellas al collection.getByCid. ¿Es posible extraer cualquier clase, fuera de una colección, teniendo en cuenta su cid, utilizando Backbone?¿Cómo puedo extraer cualquier clase por su cid en Backbone?

Por ejemplo, si tengo MyObject.Views.Tree = Backbone.View.extend({ });, puedo crear una nueva vista de árbol desde var tree = new MyObject.Views.Tree();. Llamar al tree.cid devuelve un cid específico, algo así como view231. ¿Hay alguna manera de hacer referencia a mi vista de árbol dado solo su cid? ¿Un método global Backbone.getByCid, quizás?

Respuesta

6

yo creo que hay un pequeño malentendido del modelo de programación de la columna vertebral, así como JavaScript en general. Backbone no hace un seguimiento de lo que creas; solo te ayuda a crear objetos con prototipos específicos (Modelos, Colecciones, etc.). No le importa en absoluto lo que hagas con ellos. El CID es solo un método de conveniencia que puede usar para indexar y referencias cruzadas, pero debe escribir los índices y las referencias cruzadas por su cuenta.

Así que si crea un objeto y no lo mantiene en algún lugar (en una colección, en su enrutador, en otro objeto), se vuelve inaccesible y la VM de JavaScript eventualmente lo recogerá.

+0

Ah, gracias. Esperaba algo más, pero tendré que volver a trabajar sobre cómo estoy haciendo las cosas. Gracias de nuevo. –

7

ExtJS me echó de menos y sentí la necesidad de recrear algo similar para Backbone. Tal vez esto te ayudará también? No lo he probado demasiado, pero es un cambio muy simple. Solo tenga cuidado de crear muchas cosas y no eliminarlas, o tendrá un montón de objetos registrados consumiendo memoria.

Backbone.View.Registry = { 
    items: {}, 
    register: function (id, object) { 
     this.items[id] = object; 
    }, 
    lookup: function (id) { 
     return this.items[id] || null; 
    }, 
    remove: function (id) { 
     delete this.items[id]; 
    } 
} 

Backbone.RegisteredView = Backbone.View.extend({ 
    initialize: function() { 
     Backbone.View.prototype.initialize.apply(this); 
     this.cid = this.options.id || this.cid; //just in case you want to assign a unique ID and lookup from that. 
     Backbone.View.Registry.register(this.cid, this); 
    }, 
    remove: function() { 
     Backbone.View.prototype.remove.apply(this); 
     Backbone.View.Registry.remove(this.cid); 
        return this; 
    } 
}); 

test = Backbone.RegisteredView.extend({ 
    intialize: function() { 
     return $("<div></div>"); //Just return something for this example 
    } 
}); 

div1 = new test({id: 'header_pane'}); 

div2 = new test(); 

console.log(Backbone.View.Registry.items); //Will have the header_pane and a cid based obj in it 

    ref = Backbone.View.Registry.lookup('header_pane'); 
    console.log(ref); //Will be the header_pane object 

div1.remove(); 

console.log(Backbone.View.Registry.items); //Will only have the cid based object in it 
Cuestiones relacionadas