Javascript 主干网升级问题

Javascript 主干网升级问题,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我正在从backbone.js 0.5.3升级到0.9.1,我遇到了一个特殊错误,这里是回溯: **Uncaught TypeError: object is not a function** _.extend._prepareModel _.extend.add _.extend.reset Backbone.Collection child Backbone.View.extend.render (anonymous function) Backbone.Events.trigger sta

我正在从backbone.js 0.5.3升级到0.9.1,我遇到了一个特殊错误,这里是回溯:

**Uncaught TypeError: object is not a function**
_.extend._prepareModel
_.extend.add
_.extend.reset
Backbone.Collection
child
Backbone.View.extend.render
(anonymous function)
Backbone.Events.trigger
stage.$el.stop.animate.complete
jQuery.extend.speed.opt.complete
jQuery.fx.step
t
jQuery.extend.tick
当我研究代码时,它似乎来自一个集合,但最后的错误点是:

// Prepare a model or hash of attributes to be added to this collection.
    _prepareModel: function(model, options) {
      options || (options = {});
      if (!(model instanceof Model)) {
        var attrs = model;
        options.collection = this;
        model = new this.model(attrs, options);
       /
      /
     /
   here:    Uncaught TypeError: object is not a function



        if (!model._validate(model.attributes, options)) model = false;
      } else if (!model.collection) {
        model.collection = this;
      }
      return model;
    },
更新:

根据要求,以下是步骤:

//from inside the collection (this object is actually coming in from elsewhere but 
var viewconfig ={
            id:"values-tab-panel",
            idprefix:"values-tab",
            classname:"tabpanel",
            items:[
                {
                    urlRoot:"/"+lang+"/values",
                    url:"someurl1"

                },
                {
                    urlRoot:"/"+lang+"/values",
                    url:"/someurl2"

                },
                {
                    urlRoot:"/"+lang+"/values",
                    url:"/someurl3",
                }
            ]}
    this.view   = new TabPanelView(viewconfig); 
然后在视图内部:

render: function(args){
        // 
        /*
         * what needs to happen is that the first time the render is called it creates a jquery DOM object which
         * can then be manipulated hencforth, currently there's all kinds of javscript bits which relate to it but not
         * an actual piece of DOM. closure should deal with the rest of it but theres nothing which is assigned
         * 
         */
        if(!args)
        {
            //first render
            var nav             = $("<aside/>").addClass("tab-navigation").append("<ol/>").attr("role","navigation");
            var tabcontent      = $("<section/>").addClass("tab-panels");
            for(i = 0;i<this.views.length;i++)
            {
                $("ol",nav).append("<li><a rel='"+this.views[i].id+"' href='javascript:;' class='tab-nav'></a></li>");
                tabcontent.append(this.views[i].el);
            }
            this.$el.empty().append(nav).append(tabcontent);
            //this.$el.append("<aside class='tab-navigation' ><ol role='navigation'>"+listhtm+"</ol></aside>")
            //this.$el.append("<section class='tab-panels'>"+innerhtm+"</section>");

            this.attach();
        }
        else if(args && args.update == true){
            // partial render -- i.e. update happening

            this.container = $(this.id);
            var targetid = args.what.cid;
            for(i = 0;i<this.views.length;i++)
            {
                var curcontent  = this.$el.find("div#"+this.views[i].id);
                var curlink     = this.$el.find("a[rel='"+this.views[i].id+"']")
                if(this.views[i].cid == targetid)
                {
                    curcontent.html($(this.views[i].el).html());
                    curlink.text(this.views[i].model.rawdata.header);
                }
                if(i>0)
                {
                    // set the first panel 
                    curcontent.addClass("tab-content-hide");
                }
                if(i==0)
                {
                    curcontent.addClass("tab-content-show");
                    curlink.addClass("tab-nav-selected");
                }
                //$("a[rel='"+this.views[i].id+"']").die().unbind().live("mousedown",this.switchtabs);// dont ask 
                log("a[rel='"+this.views[i].id+"']")
            }

            this.update();
        }
        return this;
    },
render:function(args){
// 
/*
*需要做的是,第一次调用渲染时,它会创建一个jquery DOM对象,该对象
*然后就可以被操纵了,hencforth,目前有各种各样的脚本位与之相关,但没有
*一个实际的DOM.closure应该处理它的其余部分,但是没有分配任何内容
* 
*/
如果(!args)
{
//第一次渲染
var nav=$(“”);
tabcontent.append(this.views[i].el);
}
这个.el.empty().append(nav.append)(tabcontent);
//此.el.append(“+listhtm+”)
//此.el.append(“+innerhtm+”);
这个。附加();
}
else if(args&&args.update==true){
//部分渲染--即发生更新
this.container=$(this.id);
var targetid=args.what.cid;
对于(i=0;i0)
{
//设置第一个面板
curcontent.addClass(“选项卡内容隐藏”);
}
如果(i==0)
{
curcontent.addClass(“选项卡内容显示”);
curlink.addClass(“选择选项卡导航”);
}
//$(“a[rel='”+this.views[i].id+“]”).die().unbind().live(“mousedown”,this.switchtabs);//不要问
日志(“a[rel=”+this.views[i].id+“]”)
}
这个.update();
}
归还这个;
},

我仍然不能完全确定这是否正确,但它已经消除了我的错误,现在一切进展顺利

似乎主干网0.9.x已经做到了这一点,因此您无法在集合的
initialize
函数中设置
模型。对我来说,错误在于,在主干网0.5.x中,我可以这样做:

var mycollection = Backbone.Collection.extend({
    initialize: function(args)
    {
        this.model = new mycollectionmodel();
                //some stuff
        }
});
var whatever = new mycollection();
但是,在主干网0.9.x中,我必须这样做:

var mycollection = Backbone.Collection.extend({
        model: mycollectionmodel,
    initialize: function(args)
    {
        //some stuff
        }
});
var whatever = new mycollection();
或者这个:

var mycollection = Backbone.Collection.extend({
    initialize: function(args)
    {
        //some stuff
        }
});
var whatever = new mycollection({model:new mycollectionmodel()});

但是第一个错误就在上面

您是否可以至少显示“Backbone.View.extend.render”函数?您是否在该行上放置了一个断点以查看
this.model
是否正确?您是否追溯到了
这个.model
的来源,以确保您真正传入了主干模型的实例?如果不使用带有示例中断的JSFIDLE或到site@tkone,我完全同意,但代码库是巨大的。。我想我已经找到了。。试着让自己冷静下来。我发现调试器控制台和断点在试图跟踪后期效果的症状时非常有用。为什么要尝试在initialize方法中设置模型?你的模型在实例化你的集合之前不存在吗?是的,这是一种实用的父集合我有一大堆非常相似的集合,它们有点不同(基本上是不同类型的选项卡式内容)。我已经放弃了动态模型的东西,扩展了一个基础模型作为第二好的