2015-10-31 73 views
0

顯示Collection項目我有一個模型和監視列表的集合骨幹 - 如何填充和模型

var Watchlist = Backbone.Model.extend({ 
    'urlRoot': 'http://myurl/watchlists', 

    'defaults': { 
     id: null, 
    }, 

    'initialize': function() { 
     this.set('movies', new MoviesCollection()); 
    }, 

    'parse': function(apiResponse){ 
     console.log("parsing wlist model"); 
     console.log(apiResponse); 
     return apiResponse; 
    } 
}); 

var Watchlists = Backbone.Collection.extend({ 
    'url': 'http://umovie.herokuapp.com/unsecure/watchlists', 
    'model': Watchlist, 

    'parse': function(apiResponse){ 
     console.log("parsing wlist collection"); 
     console.log(apiResponse); 
     return apiResponse; 
    } 
}); 

也有一個模型和電影的集合:

var MovieModel = Backbone.Model.extend({ 
    urlRoot: "http://umovie.herokuapp.com/movies", 
    defaults: { 
     trackId: "", 
     nameId: "" 
    }, 
    parse: function(response){ 
     console.log("parsing moviemodel"); 
     this.trackId=response.trackId; 
     return response; 
    } 
}); 

var MoviesCollection = Backbone.Collection.extend({ 
    model:MovieModel 
}); 

,你可以請看,Watchlist模型有一組電影。 如何在觀察列表模型更新時填充電影集合?它是否自動填充?

另外,我執行以下命令以顯示特定監視列表的電影,但預期它不工作...

<script type="text/template" id="watchlist-edit-template"> 
<h4><%= watchlist ? 'Edit' : 'Create new' %> Watchlist</h4> 
<h5><%= watchlist ? '':'Enter watchlist name:' %></h5> 
<textarea id="watchlistName" cols="50" rows="1"><%= watchlist? watchlist.name : '' %></textarea> 
<hr> 
<div id="hiddenWatchlistId" style="display:none;"><%= watchlist ? watchlist.id : 0 %></div> 
<div class="list-group"> 
    <% watchlist.movies.each(function(list){ %> 
    <a href="#" class="list-group-item"><%= list.get("trackName") %></a> 
    <% }); %> 
</div> 
</script> 

的錯誤是「遺漏的類型錯誤:watchlist.movi​​es.each不一個函數」 我不知道如何擺脫這種錯誤的...

當我顯示監視列表模式的對象,我收到以下內容: 對象{名:‘Liste2’,電影:數組[1],id:「563458d59f12f3030069949f」} 這讓我相信電影收藏是一個數組而不是一個集合。我對嗎?我應該如何解決這個問題?

我想我沒有正確填充電影集合。

你怎麼看待這一切? 感謝

+0

看看這個http://backbonerelational.org/ –

+0

看看一個與你的設置非常相似的工作示例:http:// stackoverflow。com/questions/33232006/backbone-js-fetch -json-to-model-get-returnes-undefined/33232298#33232298 – Yura

+0

也看看[url vs urlRoot之間有什麼區別](http:// stackoverflow。 com/questions/23510106/what-is-the-difference-between-url-vs-urlroot/33324142#33324142),因爲它可能會變成你不需要'urlRoot'在你的模型上設置,當你已經設置在你的收藏。 – Yura

回答

1

有幾件事情:

1)您可以通過對象的數組中的骨幹集的構造函數調用。該系列將被自動創建和填充的情況下,該集合的model針對簽發你傳遞數組中的每個對象。因此,在您的Watchlist模式initialize()功能,線路

this.set('movies', new MoviesCollection()); 

改變

this.set('movies', new MoviesCollection(this.get('movies'))); 

MoviesCollection將採用該數組並填充MovieModel的實例。

2)自動實例化對象MovieModel不會叫他們parse方法,所以你要創建一個initialize方法,做你的parse方法目前正在做什麼,例如

initialize: function(data) { 
    this.trackId = data.trackId; 
}, 

3)錯誤,Uncaught TypeError: watchlist.movies.each is not a function漸漸泛起因爲watchlist.movies是不是一個集合,因爲你懷疑,但一個正常的陣列,因此沒有一個叫each功能。

前2個修復程序也應該修復。

這是JSFiddle

+0

這非常有幫助!爲了提供這個答案,很多。我現在更好地理解Collection初始化方法。 –

+0

對不起,我不同意第3點:從給出的源代碼中,我寧願說在模板中訪問'watchlist.movi​​es.each()'是錯誤的(或者在問題中缺少重要的代碼)。從顯示的源代碼中,沒有人能夠知道「watchlist.movi​​es」的來源以及OP如何得出觀察列表模型是值爲{{name:「Liste2」,movies:Array [1],id :「563458d59f12f3030069949f」}'。即使該對象是「屬性」對象(可能是),它也不應該具有「數組」類型。雖然我同意1和2. –

+0

@ try-catch-finally您是對的,「從顯示的源代碼中,沒有人能夠知道'watchlist.movi​​es'的來源在哪裏。但是如果你點擊他的herokuapp api,你會看到他期待的數據,而且它變得非常明顯,它應該如何適應他的模型收集設置。你的觀點完全正確,「它不應該有'Array'類型。」坦率地說,我在我的答案中忘記了這一點:因爲''parse'在'initialize'之前被調用,並且他正在'parse'方法中記錄對象,所以我會假設他正在試圖插入模板 - initialize '把它變成一個集合。 – bowheart