2013-06-12 7 views
7

Jestem nowy w kręgosłupie i chciałbym poznać najlepszą praktykę w tym celu - chciałbym w łatwy sposób komunikować się z widokiem rodzica od dziecka, np. metoda na rodzica.Szkielet - widok rodzica wywołania/odniesienia z widoku podrzędnego

Rudimentary Poniższy przykład za pomocą „desktop” i widoki „dokument”:

class DesktopView extends Backbone.View{ 
    constructor(options?) { 
     super(options); 
     this.el = $('#desktop'); 
     this.createDocument(); 
    } 
    createDocument() { 
     dv = new DocumentView(); 
     $(this.el).append(dv.render()); 
    } 
} 

class DocumentView extends Backbone.View{ 
    constructor(options?) { 
     super(options);   
     this.tagName = 'div'; 
     this.className = 'document'; 
     this.events = { 
      "click": "clickHander" 
     }; 
    }; 
    render() { 
     return this.el; 
    } 

    clickHandler() { 
     //COMMUNICATE WITH THE DESKTOP VIEW 
    } 
} 

powinienem stworzyć model dla widoku dokumentu i słuchać o zmianach, które?

Odpowiedz

15

Można użyć zdarzenia szkieletową wyzwalać wywołania funkcji. Ma to tę zaletę, że widok "podrzędny" nie musi wiedzieć o jego rodzicu.

var parent = Backbone.View.extend({ 
    initialize : function() { 
    this.listenTo(Backbone, 'child-click-event', function (dataFromChild) { 
     this.doSomething(dataFromChild); 
    }, this); 
    } 
}); 

var child = Backbone.View.extend({ 
    //... 
    clickHandler : function() { 
    var data; // do something and get data 
    // Parent listens to this event. 
    Backbone.trigger('child-click-event', data); 
    } 
}); 
+0

Doskonała technika. Dzięki! –

1

Jeśli nie potrzebujesz POTRZEBUJESZ modelu, sugerowałbym przekazanie odniesienia do widoku rodzica poprzez opcje do widoku podrzędnego. Jeśli potrzebujesz modelu, a następnie tak, odsłuchaj zmiany w nim w widoku nadrzędnym. Nie jestem zaznajomiony z maszynopisu, ale chcesz zrobić coś takiego:

createDocument() { 
     that = this; 
     // give reference to parent view 
     dv = new DocumentView({desktopView : that}); 
     $(this.el).append(dv.render()); 
    } 

to powinieneś być w stanie uzyskać do niego dostęp z punktu widzenia dziecka jak:

this.options.desktopView 
+0

Dzięki Evan. Załóżmy, że mój widok pulpitu był ogromny, a ja miałem setki widoków dokumentów - czy to nadal byłoby w porządku? Nigdy nie zrozumiałem z javascriptem, czy jest to szkodliwe dla pamięci, czy też jest to tylko odniesienie do oryginalnego obiektu. – user888734

+0

Myślę, że powinno być dobrze. Jeśli napotkasz problemy z wydajnością, możesz spróbować dołączyć swoje odniesienie do globalnego obiektu "aplikacji", cokolwiek to może być. – Evan

Powiązane problemy