2

これは明らかなはずですが、非常に多くの異なる例が存在するようで、そのほとんどがエラーを引き起こし、時代遅れだと思います。基本的な状況は、ItemView を拡張する MessageView にリンクされた MessageModel、MessageCollectionView (itemView: MessageView) にリンクされた MessageCollection があることです。MessageCollection が非同期に設定されるという、少し変わったシナリオがあるため、ページが最初にレンダリングされるとき、ページは空で、「読み込み中」アイコンが表示されます。たぶん、構造が間違っているかもしれません(ここを参照してください履歴用) ですが、現時点では、サーバーに対して最初の要求を行い、MessageCollection オブジェクト内のメッセージの最初のリストを受信して​​、それ自体が更新されるようにするコードをカプセル化しました。ただし、これを考えると、ビューの表示をトリガーする方法は明確ではありません。明らかに、モデルはビューにレンダリングするように指示するべきではありませんが、ビューをインスタンス化し、モデル変更イベントをリッスンして「レンダリング」を呼び出す試みはどれもうまくいきませんでした。

私が試してみました:

  1. 読み込み要素はありません。読み込み時に要素のない CollectionView を表示するだけですが、基になるコレクションが更新された後は更新されません。
  2. modelEvents { 'change': 'render' } をビューに追加 --> Uncaught TypeError: Object function () { return parent.apply(this, arguments); メソッド「on」がありません
  3. this.bindTo(this.collection..) も試しましたが、「this」には bindTo メソッドがありませんでした
  4. 最後に、view.initialize: _.bindAll(this); で試しました。this.model.on('change': this.render); --> キャッチされていない TypeError: オブジェクト関数 () { [ネイティブ コード] } にはメソッド 'on' がありません

ここにコードがあります

    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);
        }
    };

すでに受けたすべての支援に非常に感謝しており、ご覧いただきありがとうございます。

4

1 に答える 1

3

これを試して:

var questionView = new QaApp.Views.QuestionView({
    collection: question
});
于 2013-09-06T17:47:00.973 に答える