3

URL から入力されたコレクションがあります。

var PeopleCollection = Backbone.Collection.extend({
model: Person,
url: '/hr/xml-home-3a.php'
});

次のビューを使用します。

var PeopleView = Backbone.View.extend({
    tagName: 'ul',
    initialize: function () {
        this.collection = new PeopleCollection();
        this.collection.bind("reset", this.render, this);
        this.collection.fetch();
    },
    render: function () {
        this.collection.each(function (person) {
            var personView = new PersonView({
                model: person
            });
            this.$el.append(personView.render().el);
        }, this);
        return this;
    }
});

私の質問は、このビューを 5 秒ごとに更新し、新しいフィードを取得して、この新しいフィードで再表示したいということです。

もちろん、JS を使用してページ自体をリロードすることもできますが、バックボーン内で実行できるかどうか疑問に思っていました。

4

3 に答える 3

3

次の解決策を試すことができます。他の回避策もあるかもしれませんが、次の方法を試しました。これにより、子ビューが再レンダリングされ、インスタンスが配列に保持されます。5 秒ごとに更新されると、以前の子ビューが閉じられ、新しいフェッチ データで再レンダリングされます。

var PeopleView = Backbone.View.extend({
    tagName: 'ul',
    initialize: function () {
        this.collection = new PeopleCollection();
        this.collection.bind("reset", this.render, this);
        this.collection.fetch();
    },
    render: function () {
        var self = this;
        this.childViews = [];
        this.collection.each(function (person) {
            var personView = new PersonView({
                model: person
            });
            this.childViews.push(personView);
            this.$el.append(personView.render().el);
        }, this);

        setTimeout(function(){
            self.reRender();
        }, 5000);

        return this;
    },
    reRender : function(){
        var self = this;
        this.collection.fetch({
            success : function(){
                _.each(self.childViews, function(view){
                    view.remove();
                    view.unbind();
                });

                self.childViews= [];
                self.render();
            }
        });        
    }
});
于 2013-06-13T19:26:03.917 に答える
1

setTimeout を使用して新しいコレクションのフェッチを行うことは問題ありません。

ただし、コレクション内のすべてのモデルが更新時に変更されることが確実でない限り、すべての人のビューを再レンダリングすることは最適なソリューションではありません。

より良い方法は、各個人ビューの render メソッドを、対応するコレクション モデルの変更 (イベントの変更、追加、削除) にバインドすることです。

Backbone 1.0 を使用している場合、fetch は更新を実行し、デフォルトでイベントの追加、削除、および変更をトリガーします。1.0 未満の場合は、これを実現するために fetch({update:true}) を使用します。

于 2013-06-13T20:18:25.920 に答える
1

イベント駆動型ソリューションを使用します。たとえば、フィードを更新した後、コレクションはイベントをトリガーし、そのイベントはビューによって処理される必要があります (たとえば、「render」メソッドを呼び出す必要があります)。

また、ビューはコレクションを更新するべきではなく、正反対の方法で動作する必要があります (コレクションはビューを更新する必要があります)。

于 2013-06-13T19:20:47.313 に答える