2013-03-11 60 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

相关问题