2014-10-18 73 views
0

我正在創建一個應用,允許用戶將電影標題添加到他們的主頁。這(最後)工作得很好。我在軌道寶石上使用骨幹。主幹銷燬條目

我用下面的代碼創建我的收藏中的新條目

events: -> 
    "click li": "addEntry" 

addEntry: (e) -> 
    movie_title = $(e.target).text() 
    @collection.create title: movie_title 

這是我收集

class Movieseat.Collections.Movieseats extends Backbone.Collection 

    url: '/api/movies' 
    defaults: 
    title: "" 

但我不知道我怎麼會摧毀一個入口?當我查閱Backbone頁面時,它說Destroys the model on the server。但我不想刪除整個模型,只是模型中的一個條目。

我會做出這樣的新事件,但顯然這是行不通的。

events: -> 
    "click .destroy": "destroyEntry" 

destroyEntry: (e) -> 
    @collection.destroy $(e.target) 

一些谷歌搜索後,我發現它應該刪除而不是銷燬,但這段代碼不起作用。雖然它在Fiddle

destroyEntry: (e) -> 
    thisid = @$(e.currentTarget) 
    thisitem = @collection.get(thisid) 
    @collection.remove thisitem 
+0

'但我不想刪除整個模型,只是模型中的一個條目。「你的收藏是什麼?它是所有用戶共同的全球列表嗎?並且是由每個用戶選擇的電影標題電影? – Pramod 2014-10-18 18:15:21

+0

每個用戶都會將一部電影添加到他的個人資料中。所以我必須從用戶模型中刪除電影記錄? – 2014-10-18 18:54:17

回答

1

的工作,你應該檢查出Backbone Marionette - 它使這樣的場景waaaay更易於管理。

它帶有一個內置的複合視圖,它基本上包含一個集合,集合中的每個模型都帶有一個包含該模型的ItemView。

然後,您可以收聽特定模型視圖內容的事件。所以你可以訪問@model.get('id')。這使得它很容易做到@collection.remove(@model.get('id'))

它還配備了一個內置的酒吧子框架,所以在你的ItemView控件,你可以說

@trigger "movie:title:removed", @model

而且在父集成視圖,您可以做一個

@listenTo "childview:movie:title:removed", (movie) -> 
    @collection.remove(movie) 
+1

在潛入木偶之前,我寧願學習骨架的基礎,但我會牢記這一點。 – 2014-10-18 20:23:11

1

我想你的問題是這樣的代碼:

destroyEntry: (e) -> 
    thisid = @$(e.currentTarget) 
    thisitem = @collection.get(thisid) 
    @collection.remove thisitem 

首先,你不需要讓Model將其從Collection中刪除; remove也可以帶一個ID。這在骨幹文檔中沒有做廣告,但是如果你看看源代碼,你可以看到remove確實爲你處理get

model = models [i] = this.get(models [i] );

因此,您可以簡化事情:

destroyEntry: (e) -> 
    thisid = @$(e.currentTarget) 
    @collection.remove thisid 

但是,這仍然沒有解決不了的事情,因爲你thisid不是字符串,它是一個jQuery數組。Backkbone預計的ID爲:

任意字符串(整數ID或UUID)

所以,這一切都歸結到你@$(e.currentTarget),以及如何存儲在其上的Model的ID。您是否使用Model的ID作爲元素ID?如果是這樣,你可以這樣做:

thisid = @$(e.currentTarget).attr('id') 

如果在另一方面,你要存儲數據的ID,你想要的東西更像:

thisid = @$(e.currentTarget).data('id') 

最終,關鍵的事情就是這樣您需要一個有效的ID才能使remove正常工作。一旦你得到這樣的ID,它應該可以解決你的問題。

+0

看來我在理解Rails和Backbone之間的關係時遇到了一些問題。我不確定我是否真的將條目添加到軌道電影模型中。我找不到任何使用我的控制檯。 – 2014-10-18 21:19:08

+0

您應該考慮兩者幾乎完全不同,因爲Rails處理服務器端,而Backbone處理客戶端。兩者之間的交互要點是當你在'Backbone.Model'(在這種情況下,Rails將數據傳遞給Backbone)以及在'Backbone.Model'上調用'save'時調用'fetch'(在這種情況下骨幹將數據傳遞給Rails)。如果你沒有看到在服務器上創建的數據,你需要調試'Model'的'save'方法。您可能還想觀看開發人員控制檯的「Net」選項卡,以查看保存時是否生成AJAX請求。 – machineghost 2014-10-18 21:23:59

+0

當我保存一部電影時,它會做一個AJAX請求來保存數據。數據也可以立即呈現。當我檢查我的/api/movies.json文件時,我得到了這樣的輸出:'{「id」:1,「title」:「星球大戰1」,「created_at」:「2014-10-18T21:15:56.737 Z「,」updated_at「:」2014-10-18T21:15:56.737Z「,」user_id「:1},{」id「:2,」title「:」星球大戰1「,」created_at「:」2014 -10-18T21:16:08.040Z「,」updated_at「:」2014-10-18T21:16:08.040Z「,」user_id「:1},'當我保存另一部電影時,它會被添加到json文件中。所以如果我想刪除一部電影,我將不得不尋找該電影的ID。 – 2014-10-19 00:06:00