2012-12-03 82 views
2

刪除項目我有這個集合:BackboneJS從模型陣列

var items = new bb.Collections.QuotesCollection([ 
    {id: 1, name: "item 1", units: []}, 
    {id: 2, name: "item 2", units: []}, 
    {id: 3, name: "item 3", units: []} 
]); 

然後我輸出數組「單位」,例如:

if(this.model.get('units').length){ 
     $(this.el).append('<strong>Units</strong>'); 
     $(this.el).append('<ul>'); 
     for(x in this.model.get('units')){ 
      $(this.el).append('<li class="unit">' + this.model.get('units')[x] + '</li>'); 
     } 
     $(this.el).append('</ul>'); 
    } 

上面的代碼是唯一的POC的東西,所以目前還沒有正式的模板。

events: { 
    "keypress #addUnit" : "addUnit", 
    "dblclick .unit" : "deleteUnit" 
}, 

deleteUnit: function(){ 
    this.render(); // what do I put here!? 
} 

我該如何從「units」數組中刪除一個項目(點擊的項目)?

回答

2

這是快速和骯髒的方法:

假設數組的順序通過任何其他媒介沒有改變,你可以做

deleteUnit: function() { 
    // get the index of the li you are clicking 
    var index = $('.unit').index(this); 
    this.model.get('units').splice(index, 1); 
    this.render(); 
} 

這種方式,你一定要記得之前清空您的視圖元素每一個渲染

render: function() { 
    this.$el.empty(); 
    ... 
    // business as usual 
} 
+0

就你所看到的,你的「快速和骯髒」方法有什麼缺點嗎?按照@mrappleton的回答,我會更好嗎? – benhowdle89

+0

呃,缺點是你必須記得始終保持ui的最新狀態。所以每一種排序,添加和刪除操作都應該帶有渲染。否則,我看不出任何缺點,一些純粹主義者可能在從DOM中提取索引時遇到問題。 mrappleton的解決方案並沒有真正解決您的問題,因爲您的單位不是模型 – jakee

+0

我也沒有看到以這種描繪的方式從每個單元中製作模型的意義,儘管如果每個單元都是例如對模型的引用(如單元ID等) – jakee

1

首先,你可能想爲每個模型視圖對象,所以你必須擁有該<ul>,看起來像這樣一個集合視圖:

var ParentView = Backbone.View.extend({ 
    render: function() { 
    var html = '<ul></ul>'; // make your html here (usually with templates) 
    this.$el.append(html);   
    this.collection.each(_.bind(this.initChild, this)); 
    return this; // so we can chain calls if we want to. 
    } 
    initChild: function(model) { 
    var child = new ChildView({ model: model }); 
    // this.$() is scoped to the view's el property 
    this.$('ul').append(child.render().el); 
    } 
}); 

你會再建立孩子意見是這樣的:

var ChildView = Backbone.View.extend({ 
    events: { 'click .delete', 'deleteModel' }, 
    render: function() { 
    var html = '';// make your html here (usually with templates) 
    this.$el.append(html); 
    return this; 
    }, 
    deleteModel: function(ev){ 
    ev.preventDefault(); 
    // Removes form the collection and sends an xhr DELETE 
    this.model.destroy(); 
    this.$el.remove(); 
    } 
}); 

呼叫到型號銷燬將採取從集合中刪除並把刪除發送給服務器的護理(假設你有一個網址在您的收藏/模型建立)。

+0

因此,爲了澄清,我會爲每個「單位」數組項目創建一個新的模型和新的視圖?我是否也需要一個集合? (n00b概念) – benhowdle89

+0

這個答案錯誤地假設單元是存儲在集合中的模型 – jakee

+0

啊好點,單元只是模型上的啞數組而已。在那種情況下,我會重構它們成爲一個合適的集合,或者像下面的'快速和骯髒'一樣。這取決於你想用單位做多少我想。 – mrappleton

0

至於我明白你需要從模型中刪除項

Person = Backbone.Model.extend({ initialize: function() { alert("Welcome to this world"); } }); var person = new Person({ name: "Thomas", age: 67}); delete person.name