【问题标题】:Backbone - How to populate and display Collection items from modelBackbone - 如何填充和显示模型中的集合项目
【发布时间】:2015-10-31 15:06:17
【问题描述】:

我有一个模型和一个监视列表集合

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>

错误是“Uncaught TypeError: watchlist.movi​​es.each is not a function” 我不知道如何摆脱这个错误......

当我显示监视列表模型的对象时,我收到以下信息: 对象{名称:“Liste2”,电影:数组 [1],id:“563458d59f12f3030069949f”} 这让我相信电影集合是一个数组而不是一个集合。我对吗?我应该如何解决这个问题?

我想我没有正确填充电影收藏。

你怎么看这一切? 谢谢

【问题讨论】:

标签: javascript backbone.js


【解决方案1】:

一些事情:

1) 您可以在 Backbone 集合的构造函数调用中传递对象数组。该集合将被创建并自动填充该集合的 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

【讨论】:

  • 这很有帮助!非常感谢提供这个答案。我现在更好地理解了 Collection 的初始化方法。
  • 对不起,我不同意第3点:从给出的源代码来看,我宁愿说模板中的访问watchlist.movies.each()是错误的(或者问题中缺少重要代码) .从显示的源代码中,没有人知道watchlist.movies 来自哪里,以及OP 如何得出观察列表模型是一个值为{name: "Liste2", movies: Array[1], id: "563458d59f12f3030069949f"} 的对象的结论。即使该对象是attributes 对象(可能是),它也不应该具有Array 类型。虽然我同意 1 和 2。
  • @try-catch-finally 你是对的,“从显示的源代码中没有人知道watchlist.movies 来自哪里”。但是如果你点击他的 herokuapp api,你会看到他所期望的数据,并且很明显它应该如何适合他的模型收集设置。您的观点完全正确,“它不应该具有Array 类型”。坦率地说,我在我的回答中忘记了这一点:因为parseinitialize 之前被调用,并且他在parse 方法中记录了对象,我假设那是他试图插入模板的地方——在@987654347 之前@ 把它变成一个集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多