Javascript backbone.js子视图在初始渲染时未显示
我有一个看法:Javascript backbone.js子视图在初始渲染时未显示,javascript,backbone.js,backbone-views,Javascript,Backbone.js,Backbone Views,我有一个看法: App.Views.Rebill = App.Views.baseView.extend({ view: 'requests._rebill_line', tag: 'div', className: 'row row-spaced', render: function() { var self = this; App.get_view(self.view).done(function(data){
App.Views.Rebill = App.Views.baseView.extend({
view: 'requests._rebill_line',
tag: 'div',
className: 'row row-spaced',
render: function() {
var self = this;
App.get_view(self.view).done(function(data){
var view = Mustache.render(data, {
text: self.model.get('text'),
cost: self.model.get('cost')
});
self.$el.append(view);
var $selectVat = self.$el.find('select[name="vat"]');
var vatPicker = new App.Views.VatPicker({
model: self.model,
el: $selectVat
});
vatPicker.render();
});
return self;
}
});
此视图是在父视图中创建的:
addRebillLine: function(rebillModel){
var self = this;
var rebillView = new App.Views.Rebill({
model: rebillModel
});
self.$el.after(rebillView.render().$el);
},
我已将其链接到一个按钮,该按钮创建一个空模型,并调用addRebillLine
函数。这很好,当我单击按钮时,新的重新填充视图将显示在DOM中
然而,在呈现父视图时,我运行一个json数组,用每一行创建一个模型,并用该模型调用addRebillLine
函数。这将运行,但重新填充视图不会添加到DOM中
更进一步,父视图本身是子视图,并附着到其父视图,如下所示:
this.$el.find('[data-role="repair-items"]').append(itemView.render().$el);
父视图和祖父母视图是同步呈现的,子视图是异步呈现的(App.get\u view()基本上是对$.ajax的调用,因此是.done()
值得注意的是,我在其他几个地方对App.Views.VatPicker视图也做了同样的事情,效果很好。唯一的区别是,我将要附加的元素传递到VatPicker视图中。但是,如果我传入parent
$el
元素,并在我的done()
回调中运行this.$parent.after(self.$el)
,这也不起作用。调用此行时:
this.$el.find('[data-role="repair-items"]').append(itemView.render().$el);
它假定渲染代码是同步的(应该是同步的),但渲染代码不是同步的。
当渲染返回$el尚未设置时,这是设计中的一个问题
您应该通过在视图需要时提供模板来解决此设计问题。不要在这里发明轮子,看看TodoMVC主干示例
如果您希望将模板加载到aysnc,请使用requirejs 我通过添加一个回调函数解决了这个问题,该回调函数由done()函数调用,并将子$el添加到父$el。但是我仍然不明白为什么上面的代码没有呈现。