Marionette“Uncaught TypeError:Object [object Object]没有方法'render'”,带有ItemView

时间:2013-04-28 19:54:50

标签: javascript jquery backbone.js marionette

在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);
}

3 个答案:

答案 0 :(得分:2)

使用onShow而不是onRender。当调用onRender时,该区域尚未设置

答案 1 :(得分:1)

不要绑定模型,而是尝试listenTo约定:

TestDataView = Backbone.Marionette.ItemView.extend({

    template: Handlebars.compile($('#testing-template').html()),

    initialize: function () {

        this.listenTo(this.model, 'change', this.render);

        this.model.fetch();
    }
});

就像我上面所述,如果这仍然不起作用,你要么丢失一些东西,要么你需要提供自己的渲染。

答案 2 :(得分:1)

请勿从您的视图初始值设定项中调用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);
    });
}