2011-10-10 44 views
4

我有這種觀點的結構:接入功能

window.templateLoaderView = Backbone.View.extend({}); 

window.PopupView = templateLoaderView.extend({ 
    initialize: function() { 
     this.PopupModel = new PopupModel(); 
     this.event_aggregator.bind("tasks_popup:show", this.loadTaskPopup); 
    }, 

    render: function() { 
     template= _.template($('#'+this.PopupModel.templateName).html()); 
     $(this.el).html(template(this.PopupModel.toJSON())); 
     $('#'+this.PopupModel.containerID).html(this.el); 
    }, 

    loadTaskPopup: function() { 
     this.PopupModel.loadTemplate("popupTask_templateHolder", "/js/templates/popup_task.html", "1", "container_dialog"); 
     this.render(); 
    } 
}); 

window.TaskbarView = templateLoaderView.extend({ 

    initialize: function() { 
     this.TaskbarModel = new TaskbarModel(); 
     this.PopupModel = new PopupModel(); 
    }, 

    loadTaskbarPopup: function() { 
     this.event_aggregator.trigger("tasks_popup:show"); 
    } 

}); 

所以我想runf功能在一個視圖中形成另一個。據我所知,我需要以某種方式將它們綁定在一起。是否有可能在初始化函數中綁定它們?

我在這裏看到的例子:Backbone.js - Binding from one view to another?。他們創建兩個對象,並以某種方式綁定它們。

在此先感謝,

回答

12

我很喜歡使用「事件聚合器」模式。我確保每個視圖都有相同事件聚合器對象的副本,並且它們可以通過它相互對話...有點像CB廣播:)

在創建任何視圖之前執行此操作:

Backbone.View.prototype.event_aggregator = _.extend({}, Backbone.Events); 

現在,你可以發佈/從任何地方訂閱:

window.PopupView = Backbone.View.extend({ 
    initialize: function() { 
     _.bindAll(this, "loadTaskPopup"); 
     this.model = new PopupModel(); 
     this.event_aggregator.bind("tasks_popup:show", this.loadTaskPopup); 
    }, 

    loadTaskPopup: function() { 
     // do something with this.model 
    } 
}); 

window.TaskbarView = Backbone.View.extend({ 
    loadTaskbarPopup: function() { 
     this.event_aggregator.trigger("tasks_popup:show") 
    } 
}); 
+0

謝謝布萊恩,我試着去做了,你給我的方式,但我猜是因爲我的模型和視圖的結構,它沒有工作。 Firebug拋出我這個錯誤** this.PopupModel是未定義**,當我從TaskbarView訪問此功能。你知道我該怎麼解決它? – kaha

+0

是的。你的新問題是無關的。你還沒有將'loadTaskPopup'函數綁定到你的對象的上下文中。看看我添加到PopupView.initialize中的'_.bindAll'調用。它會導致用對象的上下文('this')調用'loadTaskPopup',這樣函數可以解析'this.PopupModel'。 –

+0

我也從地道的角度加入了,你不應該創建一個名爲'PopupModel'的屬性,而應該是'model'。你的模型加載一個模板也是很奇怪的......但是我會讓你自己找出一個模板。 :) –