2013-06-12 3 views
7

Sono nuovo a Backbone e mi piacerebbe conoscere una buona pratica per questo - Mi piacerebbe un modo semplice per comunicare con una vista genitore da un bambino cioè chiamata un metodo sul genitore.Backbone - visualizzazione genitore di chiamata/riferimento da vista figlio

esempio rudimentale di seguito con "desktop" e vista "documento":

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 
    } 
} 

Devo creare un modello per la visualizzazione del documento e ascoltare per modifiche a tale?

risposta

15

Si potrebbe utilizzare gli eventi Backbone per attivare chiamate di funzione. Questo ha il vantaggio che una vista "figlio" non deve sapere del suo genitore.

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

Tecnica eccellente. Grazie! –

1

Se non si ha bisogno di un modello, suggerirei di passare un riferimento alla vista genitore attraverso le opzioni della vista figlio. Se hai bisogno di un modello, allora si ascoltano le modifiche su di esso attraverso la vista genitore. Io non sono a conoscenza dattiloscritto, ma si vuole fare qualcosa di simile:

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

allora si dovrebbe essere in grado di accedervi nella vista bambino come:

this.options.desktopView 
+0

Grazie Evan. Supponiamo che la mia vista desktop fosse enorme e che avessi centinaia di visualizzazioni di documenti: sarebbe ancora ok? Non ho mai capito bene con javascript se è male per la memoria o se si tratta solo di un riferimento all'oggetto originale. – user888734

+0

Penso che dovrebbe andare bene. Se riscontri problemi di prestazioni, puoi provare a collegare il tuo riferimento all'oggetto "app" globale, qualunque esso sia. – Evan