Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript backbone.js子视图在初始渲染时未显示_Javascript_Backbone.js_Backbone Views - Fatal编程技术网

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。但是我仍然不明白为什么上面的代码没有呈现。