如何在底层模型更改时动态更新Marionette CollectionView

时间:2013-09-06 05:22:59

标签: backbone.js marionette

这似乎应该是显而易见的,但似乎有很多不同的例子,其中大部分会给我带来错误,让我觉得它们已经过时了。基本情况是我有一个MessageModel链接到MessageView,它扩展了ItemView,MessageCollection链接到MessageCollectionView(itemView:MessageView)。我有一个稍微不寻常的情况,因为MessageCollection是异步填充的,所以当页面首次呈现时,它是空的,并且会显示“正在加载”图标。也许我的结构不正确(请参阅here了解历史记录),但是现在,我已经封装了向服务器发出初始请求的代码,并接收了MessageCollection对象中的初始消息列表,以便它更新自己。但是,鉴于此,我不清楚如何触发显示视图。显然,模型不应该告诉视图呈现,但是我没有尝试实例化视图并让它监听modelChange事件并调用“render”。

我试过了:

  1. 没有loading元素,只显示加载时没有元素的CollectionView,但是在刷新基础Collection后它不会刷新。
  2. 向视图添加modelEvents {'change':'render'} - >未捕获的TypeError:Object function(){return parent.apply(this,arguments);没有方法'on'
  3. 我也试过this.bindTo(this.collection ..)但是“这个”并没有给出一个bindTo方法
  4. 最后,我尝试了,在view.initialize:_. bindAll(this); this.model.on('change':this.render); - >未捕获的TypeError:对象函数(){[本机代码]}没有方法'on'
  5. 这是代码

        Entities.MessageCollection = Backbone.Collection.extend({
            defaults: {
                questionId: null
            },
            model: Entities.Message,
            initialize: function (models, options) {
                options || (options = {});
                if (options.title) {
                    this.title = options.title;
                }
                if (options.id) {
                    this.questionId = options.id;
                }
            },
            subscribe: function () {
                var self = this; //needed for proper scope
                QaApp.Lightstreamer.Do('subscribeUpdate', {
                    adapterName: 'QaAdapter',
                    parameterValue: this.questionId,
                    otherStuff: 'otherstuff',
                    onUpdate: function (data, options) {
                        console.log("calling sync");
                        var obj = JSON.parse(data.jsonString);
                        self.set(obj.Messages, options);
                        self.trigger('sync', self, obj.Messages, options);
                    }
                });
            },
        });
    
        Views.MessageCollectionView = Backbone.Marionette.CollectionView.extend({
            itemView: Views.MessageView,
            tagName: 'ul',
    //        modelEvents: {
    //            'change': 'render'
    //        },
            onAfterItemAdded: function (itemView) {
                this.$el.append(itemView.el);
            }
        });
    
    var Api = {
            subscribe: function (id) {
                var question = new QaApp.Entities.Question(null, { id: id });
                question.subscribe();
                var questionView = new QaApp.Views.QuestionView(question);
                QaApp.page.show(questionView);
            }
        };
    

    我非常感谢我已经收到的所有帮助,并提前感谢您的期待。

1 个答案:

答案 0 :(得分:3)

试试这个:

var questionView = new QaApp.Views.QuestionView({
    collection: question
});