2013-08-05 67 views
0

我會真的瘋了一件事:Backbone.js的listenTo問題,對象的翻譯:有沒有方法「叫」

var BoardNumber = Backbone.Model.extend({ 
    defaults: function(){ 
     return { 
      value: 0, 
      selected: false 
     }; 
    }, 

    toggle: function() { 
     this.save({selected: !this.get("selected")}); 
    } 
}); 

var BoardNumberView = Backbone.View.extend({ 
tagName: "li", 
template: _.template('<div class="boardNumber"><p>{{value}}</p></div>'), 

events: { 
    "click .boardNumber": "toggleDone", 
    "click .selected": "toggleDone" 
}, 

initialize: function() { 
    this.listenTo(this.model, 'change', this.render); 
}, 

render: function() { 
    this.$el.html(this.template(this.model.toJSON())); 
    return this; 
}, 

toggleDone: function (evt) { 
    this.model.toggle(); 
} 
}); 

var NumbersOnBoard = Backbone.Collection.extend({ 
model: BoardNumber, 
toGenerate: 80, 
url: "/numbers", 
initialize: function(){ 
    var i = this.toGenerate; 
    while(i--){ 
     this.create({ value: this.toGenerate-i }); 
    } 
}, 
selected: function(){ 
    return this.where({selected: true}); 
} 
}); 

,並沒有別的應該是必要的..當我點擊它,在標題中有這個錯誤,我真的不知道它可能是什麼

編輯:添加收藏和完整的視圖。 注意:點擊完全啓動this.render事件,只有這樣纔會發生錯誤,並且就像該模型的事件偵聽器消失一樣。

編輯#2:對於堆棧跟蹤,在骨幹網的發展版本,它表明:

triggerEvents    backbone.js:205 
Backbone.Events.trigger backbone.js:146 
_.extend._onModelEvent  backbone.js:933 
triggerEvents    backbone.js:206 
Backbone.Events.trigger backbone.js:147 
_.extend.set    backbone.js:370 
+1

你能不能把它放在一個小提琴?現在看來似乎缺少了一些東西。視圖的模板怎麼樣? –

+2

你沒有向我們展示的部分正在發生,基本結構(http://jsfiddle.net/ambiguous/kKPB2/)似乎很好。 –

+0

謝謝你,我添加其他地方.. – LowFieldTheory

回答

0

似乎沒有被任何本質上的區別你已經發布的代碼,因此它是安全的假定根本原因在於某些缺少的初始化代碼。

我可以用你的代碼,使得一些假設它是如何應該做的工作:

  1. 你呈現由NumbersOnBoard收集產生的項目清單。
  2. 這個項目列表被創建並保存到數據庫時,新的集合。
  3. 集合中的每個模型都在某種父視圖內呈現。
  4. 此父視圖將每個孩子的視圖追加到DOM的某處,可能位於其自己的容器中
  5. 模型表示某種可選項目;他們的狀態變化,當點擊並立即堅持到數據庫

假設這是全部爲真,this fiddle demonstrates it successfully issuing a GET request on click。爲了使它工作,我添加了一個CollectionView,負責渲染每個BoardNumberView

var CollectionView = Backbone.View.extend({ 
    tagName: 'ul', 
    itemView: BoardNumberView, 
    children: [], 
    initialize: function(options) { 
     this.collection = options.collection; 
    }, 
    render: function() { 
     var self = this; 
     _.each(this.collection.models, function(child) { 
      var view = new self.itemView({ 
       model: child 
      }); 
      view.render(); 
      self.children.push(view); 
      self.$el.append(view.$el); 
     }); 
     return this; 
    }, 
    close: function() { 
     while (this.children.length) { 
      var child = this.children.pop(); 
      child.close(); 
     } 
    } 
}); 

var collection = new NumbersOnBoard(); 
var cv = new CollectionView({ 
    collection: collection 
}); 

$('body').append(cv.render().$el); 
0

對於渲染的項目清單,我會建議使用Backbone Marionette,這使得寫在示例中,所有的樣板代碼。

在這種情況下,BoardNumberView將是ItemView,並且集合呈現視圖將是CollectionViewCompositeView

它的文檔很簡單,但如果你想進一步調查,我會建議posts of David Sulc

0

謝謝大家的回覆,我剛剛發現它有什麼問題。在BoardNumberView的父視圖中,在初始化中存在以下代碼:

this.listenTo(numbersOnBoard, 'change', this.addAll()); 

發射錯誤的事件。這一切工作時,我改變它:

this.listenTo(numbersOnBoard, 'reset', this.addAll()); 

而我不知何故明白爲什麼,看着Backbone的代碼。有人知道它在Backbone中是如何工作的,並在簡單的段落中解釋它?

再次謝謝你,真的。

編輯:NO,是事實),我正好路過this.addAll(而不是this.addAll

相關問題