Backbone.js 每个模型有多个数据源

Backbone.js 每个模型有多个数据源,backbone.js,Backbone.js,我有一个集合,它表示从url和.fetch()加载的电影列表。此url返回包含摘要信息的电影列表,例如movieid和moviename。然后,我想根据此集合中的movieid从另一个URL加载有关此电影的更多信息 因此,我的第一个url()响应为: { "movies": [ { "movieid": "1234", "moviename": "Iron Man" } ] } { "cover_img": "blahblah", "rating": "10/10"

我有一个集合,它表示从
url
.fetch()
加载的电影列表。此url返回包含摘要信息的电影列表,例如
movieid
moviename
。然后,我想根据此集合中的
movieid
从另一个URL加载有关此电影的更多信息

因此,我的第一个url()响应为:

{ 
    "movies": [ { "movieid": "1234", "moviename": "Iron Man" } ]
}
{
    "cover_img": "blahblah",
    "rating": "10/10"
}
然后,我想为集合{movieid}中的每个模型加载,该集合的响应是:

{ 
    "movies": [ { "movieid": "1234", "moviename": "Iron Man" } ]
}
{
    "cover_img": "blahblah",
    "rating": "10/10"
}

如何将这两个数据集合并到一个模型中,以便通过集合轻松加载?

保持关注点分离是一个很好的做法。 因此,我建议采取以下措施:

  • MoviesCollection=>应该是MovieModel的集合。它应该只从源url加载电影数组
  • MovieModel应该进行提取以提取其附加数据。 您可以在模型的initialize函数中添加一个监听器,它将触发“fetch”方法
  • 电影的模型负责抓取 其他数据:

    var Movie = Backbone.Model.extend({
        url: function() {
            return 'http://movieapi.com/movie/' + this.movieid;
        },
    
        initialize: function(){
            this.fetch();
        }
    });
    
    电影集合负责获取其id为的电影列表:

    var Movies = Backbone.Collection.extend({
        model: Movie,
    
        url: 'http://movieapi/popular',
    
        // need to intercept the response since the array of movies
        // is nested inside the response
        parse: function(res) {
            if (res && res.movies) {
                return res.movies;
            }
        }
    });
    

    如何确保电影模型在渲染到视图中之前已加载其“额外数据”。数据不会阻止渲染。您可以尽快呈现您拥有的数据,并在获取模型时使用其他数据重新呈现。2.数据块渲染。在这种情况下,您可以使用
    $。when
    fetch
    返回承诺的事实。您可以编写如下内容:
    $.when.apply($,movies.map(函数(movie){return movie.fetch();}))。然后(/*进行一些渲染*/)
    hi@jducanator,我可以建议两种可能性:1。将电影模型内的侦听器注册到来自额外数据的特定属性,即:this.on(“更改:完整描述”,this.onExtraDataChange,this);然后在回调函数上,触发一个自定义事件,该事件将通知模型的数据已就绪:即this.trigger('ready:movie')。2.另一方面,可以在渲染模型的视图上放置相同的逻辑,并在额外属性发生更改时渲染模型的数据。