Backbone.js 未捕获类型错误:对象函数没有方法';tojson';

Backbone.js 未捕获类型错误:对象函数没有方法';tojson';,backbone.js,marionette,Backbone.js,Marionette,我创建了一个这样的模型 define(['backbone', 'text_dictionary'], function(Backbone, Text_Dict) { var IndexPageModel = Backbone.Model.extend({ defaults:{ val_btn_gotohomepage : Text_Dict.val_btn_gotohomepage, val_btn_gotologinpage : Text_Dict.v

我创建了一个这样的模型

define(['backbone', 'text_dictionary'], function(Backbone, Text_Dict) {
var IndexPageModel = Backbone.Model.extend({
    defaults:{
        val_btn_gotohomepage : Text_Dict.val_btn_gotohomepage,
        val_btn_gotologinpage : Text_Dict.val_btn_gotologinpage,
        val_btn_gotolistpage : Text_Dict.val_btn_gotolistpage
    }
});
return IndexPageModel;
});
并在我的页面代码中用“new”实例化了这个模型,如下所示

define([ 'page_layout', 
     'panel_itemview',
     'header_itemview', 
     'content_itemview', 
     'footer_itemview',
     'templates',
     'text_dictionary',
     'indexpage_model',
     'indexpage_logic'], 
    function( Page,
              Panel,
              Header,
              Content,
              Footer,
              Templates,
              Text_Dict,
              IndexPageModel,
              IndexPage_BusnLogic) {
console.log("Success..Inside Index Page.");
var Page_Index = {};
Page_Index.page = (function(){
    var _pageName = Text_Dict.indexpage_name;
    var _pageModel = new IndexPageModel();
    return _pageLayout = Page.pageLayout({
        name:_pageName,
        panelView:      Panel.panelView({name:_pageName, pagetemplate: Templates.simple_panel}),
        headerView:     Header.headerView({name:_pageName, title: Text_Dict.indexpage_header, pagetemplate: Templates.header_with_buttons}),
        contentView:    Content.contentView({name:_pageName, page_model:_pageModel, pagetemplate:Templates.content_index, busn_logic:IndexPage_BusnLogic.HandleEvents}),
        footerView:     Footer.footerView({name:_pageName, title: Text_Dict.indexpage_footer, pagetemplate: Templates.simple_footer})
    });
})();

return Page_Index;
});
define([ 'underscore', 'marionette', 'event_dictionary', 'app' ], function(_, 
    Marionette, Event_Dict, App) {
console.log("Success..Inside Content Index View.");
var Content = {};
Content.contentView = function(opts) {
    return new (Marionette.ItemView.extend({
        tagName : 'div',
        attributes : function() {
            console.log('options name==' + opts.name);
            console.log("page model=="+opts.page_model);
            return {
                'region_id' : 'content',
                'id' : 'content_' + opts.name,
                'data-role' : 'content'
            };
        },
        initialize : function() {
            _.bindAll(this, "template");
        },
        template : function() {
            return opts.pagetemplate;
        },
        model : function() {
            return opts.page_model;
        }
    }))(opts);
};
return Content;
});
我的页面是使用页面布局创建的

define([ 'underscore', 'marionette' ], function( _, Marionette ) {
console.log("Success..Inside Index View.");
var Page = {};
var _ReplaceWithRegion = Marionette.Region.extend({
     open: function(view){
        //Need this to keep Panel/Header/Content/Footer at the same level for panel to work properly
        this.$el.replaceWith(view.el);
    }
});
Page.pageLayout = function (opts) {
    var _opts = _.extend ({ name: 'noname',
                            panelView: null,
                            headerView: null,
                            contentView: null, 
                            footerView: null,                               
                            }, opts);
    return new ( Marionette.Layout.extend({
        tagName: 'section', 
        attributes: function() {
            return {
                'id':           'page_' + _opts.name,
                'data-url':     'page_' + _opts.name,
                'data-role':    'page',
                'data-theme':   'a'
            };
        },
        template: function () { 
            return "<div region_id='panel'/><div region_id='header'/><div region_id='content'/><div region_id='footer'/>";
        },
        regions: {
          panel:    {selector: "[region_id=panel]",     regionType: _ReplaceWithRegion},
          header:   {selector: "[region_id=header]",    regionType: _ReplaceWithRegion},
          content:  {selector: "[region_id=content]",   regionType: _ReplaceWithRegion},
          footer:   {selector: "[region_id=footer]",    regionType: _ReplaceWithRegion},
        },

        initialize: function(){
            $('body').append(this.$el);
            this.render();
        },              
        onRender: function() {
            if (this.options.panelView) {
                this.panel.show (this.options.panelView);
            };
            if (this.options.headerView) {
                this.header.show (this.options.headerView);
            };
            if (this.options.contentView) {
                this.content.show(this.options.contentView);
            };
            if (this.options.footerView) {
                this.footer.show (this.options.footerView);
            };
        },
    }))(_opts);
};
return Page;
});
这给了我错误

Uncaught TypeError: Object function () {
            return opts.page_model;
        } has no method 'toJSON' 

视图的
model
属性不能是函数。主干网允许这样做,例如
url
(通过
.result
helper函数),但在这种情况下不允许这样做。将视图代码更改为没有
模型
功能,只需在
初始化
中执行此操作:

initialize: function (options) {
    this.model = this.page_model = options.page_model;
}

更新因为您不会仅仅相信我的话,这几乎肯定是异常堆栈跟踪的顶部。再次说明:
view.model
必须是模型对象而不是函数。解决这个问题,错误就会消失。

公认的答案是正确的,但我花了一点时间才弄清楚我为什么会出现这个错误,所以我提供了我个人用例的解决方案,以防将来有人在这个页面上绊倒

我有这个:

app.module 'Widget.Meta', (Meta, app, Backbone, Marionette, $, _) ->

  Meta.metaView = Backbone.Marionette.ItemView.extend
    model: app.Entities.Models.meta
    template: '#meta-template'
app.module 'Widget.Meta', (Meta, app, Backbone, Marionette, $, _) ->

  Meta.metaView = Backbone.Marionette.ItemView.extend
    model: new app.Entities.Models.meta()
    template: '#meta-template'
。。。当我应该有这个的时候:

app.module 'Widget.Meta', (Meta, app, Backbone, Marionette, $, _) ->

  Meta.metaView = Backbone.Marionette.ItemView.extend
    model: app.Entities.Models.meta
    template: '#meta-template'
app.module 'Widget.Meta', (Meta, app, Backbone, Marionette, $, _) ->

  Meta.metaView = Backbone.Marionette.ItemView.extend
    model: new app.Entities.Models.meta()
    template: '#meta-template'

这只是实例化函数定义的问题。

能否提供实例化视图的代码行?另外,您能否提供关于opts.page\u模型引用的内容的信息?实际上,我使用的是一种非常不同的方式来创建页面,您能否参考我的github repo中的代码。。它就在这里@dcarsonIt如果你能在问题中发布相关的位,而不是我们必须查看你的代码,那就太好了:)但是问题可能是你传递的函数是一个模型,而不是一个对象文字。你好@dcarson我已经更新了我的代码,请检查。Peter Lyons证实了我在我的在上面的注释中,实际上是将函数作为模型传递。他的代码示例应该可以正常工作:)Hello@Peter Lyons谢谢你的回复。但早些时候,我将model属性用作函数,它工作得非常好。你能看看我上面的完整代码吗?我已经编辑了我的问题,并为我提供了有价值的答案。提前感谢。对不起,您对
view.model
是一个函数并且工作正常的说法是错误的。请阅读我在回答中更新的木偶源代码的链接,以确定答案。只需执行
model:opts.page\u model
?非常感谢大家的回复。很抱歉@PeterLyons不相信你。但是在做了
model:opts.page\u model
之后,这个错误得到了解决,但是出现了一个新的未捕获的引用错误:val\u btn\u gotohomepage,我在我的模型中声明了它以及我使用它的模板。你能告诉我现在该怎么办吗。