1

我有一个集合,我需要在触发路由时访问集合中的模型:

App.Houses = Backbone.Collection.extend({
    model: App.House,
    url: API_URL,
})

App.houseCollection = new App.Houses()
App.houseCollection.fetch();


App.HouseDetailRouter = Backbone.Router.extend({
    routes: {
        '': 'main',
        'details/:id': 'details',
    },
    initialize: function() {

    },
    main: function() {
        App.Events.trigger('show_main_view');  
    },
    details: function(id) {
        model = App.houseCollection.get(id);
        console.log(model);
        App.Events.trigger('show_house', model);
    },
});

结果console.log(model)undefined。我认为是这种情况是因为集合还没有完成fetch()调用?

我想将模型附加到我正在触发的事件,以便响应事件的视图可以利用它。我可能采取了不好的方法,我不确定。

响应事件的视图之一:

App.HouseDetailView = Backbone.View.extend({
    el: '.house-details-area', 
    initialize: function() {
        this.template = _.template($('#house-details-template').html());
        App.Events.on('show_house', this.render, this);
        App.Events.on('show_main_view', this.hide, this);
    },
    events: {
        'click .btn-close': 'hide',
    },
    render: function(model) {
          var html = this.template({model:model.toJSON()});
          $(this.el).html(html);
          $(this.el).show();
    },
    hide: function() {
        $(this.el).hide();
        App.detailsRouter.navigate('/', true);
    }   
});

编辑:有点hacky修复:查看详细信息()

App.HouseDetailRouter = Backbone.Router.extend({
    routes: {
        '': 'main',
        'details/:id': 'details',
    },
    initialize: function() {

    },
    main: function() {
        App.Events.trigger('show_main_view');  
    },
    details: function(id) {
        if (App.houseCollection.models.length === 0) {
           // if we are browsing to website.com/#details/:id
           // directly, and the collection has not finished fetch(),
           // we fetch the model.
           model = new App.House();
           model.id = id;
           model.fetch({
               success: function(data) {
                   App.Events.trigger('show_house', data);
               } 
           });
        } else {
            // if we are getting to website.com/#details after browsing 
            // to website.com, the collection is already populated.
            model = App.houseCollection.get(id);            
            App.Events.trigger('show_house', model);
        }
    },
});
4

1 回答 1

1

由于您既没有使用回调也没有使用事件来知道集合的fetch调用何时完成,因此获取集合可能会产生错误,或者您想要的模型未包含在服务器响应中,或者您正在路由到之前fetch完成的视图。

至于您的方法,这里有一些杂项提示:

  • 最好在视图的构造函数options参数中将模型传递给视图。render()不接受任何争论,我认为改变这一点是非常规的。
  • 总是thisrender()你的观点中返回
  • 您可以将您的this.template = _.template代码移动到您传递给extend. 此代码只需要在每次应用加载时运行一次,而不是针对每个单独的视图
  • 现在最简单的可能是在你的details路由函数中只实例化一个模型和一个视图,调用fetch感兴趣的特定模型,并使用success回调来知道何时渲染视图。
于 2012-06-16T15:06:08.350 回答