2013-03-11 72 views
0

我想加載和渲染額外的視圖異步並將它們追加到ItemView。Marionette + RequireJS:在ItemView.render()中做一個require

簡化代碼 - 爲什麼$el沒有在require()塊中定義render() - 我在這裏丟失了什麼?我沒有正確使用RequireJS,還是使用Marionette,或者僅僅是我對javascript的經驗不足?

這樣做的建議方法是什麼?它需要是動態的,因爲額外的部分視圖可能在運行時可用,我還不知道它是否被插件註冊過。

define(['require','marionette', 'App', 'swig', 'backbone.wreqr','text!./settings.html'], 
function (require,Marionette, App,Swig, Wreqr, settingsHtml) 
{ 

    var sectionViews = ['./settingscontent/GeneralView']; 

    var SettingsView = Marionette.ItemView.extend(
     { 
      template: Swig.compile(settingsHtml), 
      commands: new Wreqr.Commands(), 
      initialize: function() 
      { 
       this.commands.addHandler('save', function (options, callback) 
       { 
        callback(); 
       }); 
       Marionette.ItemView.prototype.initialize.apply(this, arguments); 
      }, 
      render: function() 
      { 

       Marionette.ItemView.prototype.render.call(this); 
       var $el = this.$el; 
       var self = this; 
       require(sectionViews, function (View) 
       { 
        $el.find('div.tab-content').append(new View(self.model).render().$el); 
       // $el is not defined 
       // self != outer this - $el is an empty div 
       }); 
       return this; 

      } 
     } 
    return SettingsView; 
}) 

回答

0

爲什麼你想重載itemview.render?

爲什麼不使用內置的OnRender事件 https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.itemview.md#render--onrender-event

從文檔:

Backbone.Marionette.ItemView.extend({ 
    onRender: function(){ 
    // manipulate the `el` here. it's already 
    // been rendered, and is full of the view's 
    // HTML, ready to go. 
} 
}); 

似乎更容易和更典型的提線木偶的使用

+0

如果我有足夠的分數,我會倒下來,你的回答沒有解決我的查詢要點()中的要點。結果在onRender中是一樣的(已經測試過) – Tim 2013-03-11 18:43:23

+0

當我看到忽略模式的代碼時,我總是首先解決這個模式,這通常表明程序員正在努力使貓叫聲。在你的情況下,你仍然應該看看你爲什麼這樣做。但是,您的範圍也不正確。 require(sectionViews,function(View)爲你創建一個新的範圍,所以$ el是不可訪問的。 – MarkKGreenway 2013-03-11 19:02:13

0

您需要綁定this的功能裏面SettingsView對象。喜歡的東西:

render: function() 
{ 
    Marionette.ItemView.prototype.render.call(this); 
    var $el = this.$el; 
    var self = this; 
    require(sectionViews, _.bind(function (View) 
    { 
     ... 
    }, this)); 
    return this; 
} 

局部變量不會被綁定函數內部可見。但是,您可以安全地使用thisthis.$el

相關問題