Javascript 主干网升级问题
我正在从backbone.js 0.5.3升级到0.9.1,我遇到了一个特殊错误,这里是回溯: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
**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方法中设置模型?你的模型在实例化你的集合之前不存在吗?是的,这是一种实用的父集合我有一大堆非常相似的集合,它们有点不同(基本上是不同类型的选项卡式内容)。我已经放弃了动态模型的东西,扩展了一个基础模型作为第二好的