2013-06-12 43 views
7

我是Backbone的新手,我想知道最佳做法 - 我想要一個簡單的方法與孩子的父視圖進行通信,例如調用父母方法。下面使用「桌面」和「文件」的意見骨幹 - 來自子視圖的調用/引用父視圖

基本的例子:

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

我應該創建一個文檔視圖模型,並聽取了變化呢?

回答

15

你可以使用骨幹事件觸發函數調用。這具有的優點是「孩子」的觀點不必知道它的父母。

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

優秀的技術。謝謝! –

1

如果你不需要一個模型,我會建議通過對子視圖的選項傳遞對父視圖的引用。如果你確實需要一個模型,那麼是通過父視圖監聽它的變化。我不熟悉的打字稿,但你想要做這樣的事情:

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

那麼你應該能夠訪問它像孩子的看法:

this.options.desktopView 
+0

謝謝埃文。假設我的桌面視圖是巨大的,並且我有數百個文檔視圖 - 那還可以嗎?我從來沒有完全理解JavaScript是否對內存不利,或者它只是對原始對象的引用。 – user888734

+0

我認爲應該沒問題。如果你遇到了性能問題,你可以試着將你的引用附加到你的全局「應用」對象,不管它是什麼。 – Evan