2011-08-26 16 views
5

Korzystając z aplikacji Backbone.js zauważyłem, że zarówno widoki, jak i modele mają podane wartości. Rozumiem, że jeśli te klasy są częścią kolekcji, mogę je pobrać dowolną z nich przez collection.getByCid. Czy jest możliwe wyciągnięcie dowolnej klasy, poza kolekcją, biorąc pod uwagę jej identyfikator, używając Backbone? Na przykład, jeśli mam MyObject.Views.Tree = Backbone.View.extend({ });, mogę utworzyć nowy widok drzewa z var tree = new MyObject.Views.Tree();. Wywołanie tree.cid zwraca określony identyfikator - coś takiego jak view231. Czy istnieje sposób odwoływania się do mojego widoku drzewa z podaniem tylko jego cid? Może być globalna metoda Backbone.getByCid?Jak mogę wyciągnąć dowolną klasę przez jej cid w Backbone?

Odpowiedz

6

nr

myślę, że masz lekkie nieporozumienie modelu programowania kręgosłup, a także JavaScript w ogóle. Szkielet nie śledzi tego, co tworzysz; pomaga tylko tworzyć obiekty z określonymi prototypami (modele, kolekcje itp.). W ogóle nie obchodzi ich, co z nimi robisz. CID jest po prostu wygodną metodą, którą możesz użyć do indeksowania i odsyłania, ale musisz sam napisać indeksy i odsyłacze.

Jeśli więc utworzysz obiekt i nie będziesz go gdzieś przechowywać (w kolekcji, na routerze, w innym obiekcie), stanie się on niedostępny, a maszyna wirtualna JavaScript w końcu go wyrzuci.

+0

Ah, dzięki. Miałem nadzieję na coś innego, ale muszę po prostu przerobić, jak sobie radzę. Dzięki jeszcze raz. –

7

Zepsute urządzenie ExtJS i poczułem potrzebę odtworzenia czegoś podobnego do szkieletu. Może to ci pomoże? Nie testowałem tego zbyt wiele, ale to bardzo prosta zmiana. Po prostu zachowaj ostrożność, tworząc wiele rzeczy i nie usuwając ich, lub będziesz miał kilka zarejestrowanych obiektów pochłaniających pamięć.

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 
Powiązane problemy