2012-03-13 4 views
0

Я перехожу от Backbone.js 0.5.3 до 0.9.1 и я возникают проблемы с одной конкретной ошибкой здесь является обратной трассировки:обновления Backbone вопросы

**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; 
    }, 

Update:

в соответствии с просьбой вот шаги:

//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; 
    }, 
+1

Не могли бы вы показать хотя бы функцию «Backbone.View.extend.render»? –

+1

Вы поставили точку останова на этой строке, чтобы увидеть, что 'this.model' есть? Вы проследили это, чтобы посмотреть, откуда приходит этот метод?, Чтобы убедиться, что вы действительно проходите в экземпляре модели Backbone? Это довольно неясное решение без jsfiddle с примером взлома, или ссылка на сайт – tkone

+0

@tkone, я полностью согласен, но кодовая база огромна .. Я думаю, что я ее отследил .. пытаясь работать несколько бит – Alex

ответ

1

Я все еще не полностью уверен, если это право ут он удален мою ошибку и делает вещи прогресса хорошо в настоящее время.

Кажется, что Backbone 0.9.x сделал это так, что вы не можете установить model в своей функции initialize вашей коллекции. Для меня ошибка в том, что в позвоночнике 0.5.xi могли бы сделать это:

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

однако в позвоночнике 0.9.xi должны сделать это:

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

но первая выбрасывает ошибку выше ...

+0

Почему вы пытаетесь установить свою модель в методе initialize? Ваша модель не существует до момента создания вашей коллекции? – tkone

+0

yep - своего рода коллекция родительских утилит. У меня есть на самом деле похожие коллекции, которые немного отличаются (в основном разные типы вкладок). Я сломал динамическую модель и расширил базовый уровень как второй – Alex

Смежные вопросы