2013-11-24 59 views
1

我試圖使用主幹從表單保存我的模型時出現問題。在這裏,我想我的我的觀點實際上是一個編輯表單:Backbone.js model.save()在下劃線中激發「太多的遞歸」錯誤

(function() { 

    'use strict'; 

    var YachtEditor = {}; 
    window.YachtEditor = YachtEditor; 

    var template = function(name) { 
     return Mustache.compile($('#' + name + 'Template').html()); 
    }; 

    YachtEditor.Tank = Backbone.Model.extend({ 
     defaults : { 
      dCapacity : "", 
      sType : "" 
     } 
    }); 

    YachtEditor.Tanks = Backbone.Collection.extend({ 
    //  url: "/rest/tanks", 
     localStorage: new Store("tanks"), 
     model : YachtEditor.Tank 
    }); 

    YachtEditor.TankView = Backbone.View.extend({ 
     template: template("tank"), 
     events: { 
      'click .save' : 'save', 
      'click .remove' : 'remove' 
     }, 
     initialize: function() { 
      console.log("initialize tank View :"); 
      console.log(this.model.get("id")); 
     }, 
     render: function() { 
      this.$el.html(this.template(this)); 
      return this; 
     }, 
     save: function() { 
      console.log('change'); 

      var self = this; 
      var values = { 
        sType:  self.$("#sType").val(), 
        dCapacity: self.$("#dCapacity").val() 
       }; 

      console.log("dCapacity : " + values.dCapacity); 
      console.log("sType : " + values.sType); 

      this.model.save(values); 
     }, 
     remove: function() { 
      this.model.destroy(); 
     }, 
     dCapacity : function() { 
      return this.model.get("dCapacity"); 
     }, 
     sType : function() { 
      return this.model.get("sType"); 
     } 
    }); 

    YachtEditor.TanksView = Backbone.View.extend({ 
     el: $("div.tankZone"), 
     template: template("tanks"), 
     events: { 
      "click .add" : "addTank", 
      "click .clear" : "clear" 
     }, 
     initialize: function() { 
      this.tanks = new YachtEditor.Tanks(); 
//   this.tanks.on('all', this.render, this); 
      this.tanks.fetch(); 
      this.render(); 
     }, 
     render: function() { 
      this.$el.html(this.template(this)); 
      this.tanks.each(this.renderTank, this); 
      return this; 
     }, 
     renderTank: function(tank) { 
      var view = new YachtEditor.TankView({model: tank}); 
      $(".tanks").append(view.render().el); 
      return this; 
     }, 
     addTank: function() { 
      this.tanks.create({}); 
      this.render(); 
     }, 
     clear: function() { 
      this.tanks.each(function(tank) { 
       tank.destroy(); 
      }); 
      this.render(); 
     } 
    }); 
    ... 
    })(); 

這裏是我使用的每個罐的鬍子模板

<script id="tankTemplate" type="text/x-mustache-template">  
    <div class="tankView"> 
     <h1>Tank</h1> 
     <select id="sType" value="{{ sType }}"> 
      @for(option <- Tank.Type.values().toList) { 
       <option>@option.toString</option> 
      } 
     </select> 
     <input id="dCapacity" type="text" value="{{ dCapacity }}"> 
     <button class="destroy">x</button> 
    </div> 
</script> 

我在這裏的問題是,this.model.save()觸發器下劃線中的'遞歸太多'。 JS。 (鉻也顯示錯誤

這裏是錯誤的調用堆棧:

_.extend 
_.clone 
_.extend.toJSON 
_.extend.save 
_.extend.update 
Backbone.sync 
_.extend.sync 
_.extend.save 
YachtEditor.TankView.Backbone.View.extend.save 
st.event.dispatch 
y.handle 

我懷疑保存召回blur事件,但我不能找到一種方法來明確它...也許我?「M沒有使用支柱,我應該

+0

我沒有看到任何明顯錯誤的代碼,你能錯誤的堆棧跟蹤,以便我們可以知道哪個方法遞歸調用? –

+0

我更新了帖子,讓你看到錯誤調用堆棧 – stamm

回答

0

一些事情你定義你的坦克模型

app.Tank = ... 

,但您的收藏你引用它:

model : YachtEditor.Tank 

,並在您看來,您要分配的元素,他們在頁面上呈現前:

this.input = {} 
this.input.sType  = this.$("#sType"); 
this.input.dCapacity = this.$("#dCapacity"); 

我不知道您的看法如何渲染頁面,有些人,像我喜歡用渲染()來直接呈現模板頁面:

render: function() { 
    this.$el.html(this.template(this)); 
    //done, you should be able to see the form on the page now. 
}, 

一些人,會用別的東西來插入EL,如:

//in another view 
tankView.render().$el.appendTo('body'); 

但無論哪種方式,如果要緩存元素,則需要在呈現到頁面後執行,而不是初始化。

//this method is only called after render() is called! 
cacheElements: function() { 
    this.input = {} 
    this.input.sType  = this.$("#sType"); 
    this.input.dCapacity = this.$("#dCapacity"); 
} 

我建議,首先,嘗試解決這個事情,然後,嘗試添加一些控制檯日誌或調試器在您的readForm方法,看看是否值正確抓起:

readForm: function() { 
    var input = this.input; 
    console.log(input.sType.val()); 
    console.log(input.dCapacity.val()); 
    this.model.save({ 
     sType:  input.sType.val(), 
     dCapacity: input.dCapacity.val() 
    }); 
}, 
+0

好了,所以我糾正了我的糟糕的重構並壓制了元素緩存。我還在Tank模板中添加了一個保存按鈕,以消除任何事件遞歸猜疑。我會編輯我的問題來更新所有內容。我還會添加Motherview的代碼(管理列表的代碼) – stamm

+0

所以你會在控制檯日誌中看到正確的值嗎?也可以嘗試在控制檯中創建模型並嘗試保存它嗎? –

+0

是的,我實際上可以看到正確的值,但model.save仍然給我一個錯誤...有時候save()會返回,但是再次調用它會引發錯誤。另外:localStorage沒有更新 – stamm

1

我的問題,除了Yurui Ray Zhang指出的一些問題(謝謝)之外,我使用的是我在這裏找到的示例中的backbone-localstorage.js:git://github.com/ngauthier/intro-to- backbone-js.git

「太多的遞歸錯誤」停止出現,儘快將其替換爲存儲I在這裏找到:https://github.com/jeromegn/Backbone.localStorage