我想加载和渲染额外的视图异步并将它们追加到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;
})
如果我有足够的分数,我会倒下来,你的回答没有解决我的查询要点()中的要点。结果在onRender中是一样的(已经测试过) – Tim 2013-03-11 18:43:23
当我看到忽略模式的代码时,我总是首先解决这个模式,这通常表明程序员正在努力使猫叫声。在你的情况下,你仍然应该看看你为什么这样做。但是,您的范围也不正确。 require(sectionViews,function(View)为你创建一个新的范围,所以$ el是不可访问的。 – MarkKGreenway 2013-03-11 19:02:13