木偶未捕获TypeError: Object [Object Object]没有ItemView方法'rende

Marionette "Uncaught TypeError: Object [object Object] has no method 'render'", with ItemView

本文关键字:Object ItemView 没有 方法 rende TypeError      更新时间:2023-09-26

在Bakbone Marionette中,我试图显示一个带有模型数据的IteView。来自其余api的JSON数据很好。问题是,每当我试图在一个区域内显示视图时,它都会显示上述错误。

这是代码:

TestDataModel = Backbone.Model.extend({
    url: function(){
        return '/test.php?api=getTestData
    }
});
TestDataView = Backbone.Marionette.ItemView.extend({
    template: Handlebars.compile($('#testing-template').html()),
    initialize: function(){
        _.bindAll(this);
        // I want to bind render when the model changes        
        this.model.on('change', this.render, this);        
        this.model.fetch();
    }
});

<script id='testing-template' type='text/x-handlebars-template'>
    Testing template: {{test_token1}} {{test_token2}}
</script>
// this the main function that render the data on a main base page region.
onRender: function(){
    var testModel = new TestDataModel.Model();
    var testView = new TestDataView({
         model:testModel
    });
    this.test_region.show(testView);
}

使用onShow代替onRender。当onRender被调用

时区域还没有被设置

不要绑定到模型上,尝试使用listenTo约定:

TestDataView = Backbone.Marionette.ItemView.extend({
    template: Handlebars.compile($('#testing-template').html()),
    initialize: function () {
        this.listenTo(this.model, 'change', this.render);
        this.model.fetch();
    }
});

就像我上面说的,如果这仍然不起作用,你要么错过了什么,要么你需要提供自己的渲染。

不要从视图初始化器中调用fetch。

TestDataModel = Backbone.Model.extend({
    url: function(){
        return '/test.php?api=getTestData
    }
});
TestDataView = Backbone.Marionette.ItemView.extend({
    template: Handlebars.compile($('#testing-template').html()),
    initialize: function(){
        _.bindAll(this); 
        this.model.on('change', this.render, this);        
    }
});

<script id='testing-template' type='text/x-handlebars-template'>
    Testing template: {{test_token1}} {{test_token2}}
</script>
// this the main function that render the data on a main base page region.
onRender: function(){
    var self = this;
    var testModel = new TestDataModel.Model();
    var testView = new TestDataView({
         model:testModel
    });
    this.testModel.fetch().done(function(){
      self.test_region.show(testView);
    });
}