6

Ember.js でリアルタイム データを処理する方法はありますか?

私が探しているのは、以前に返された結果に更新されたレコードと新しいレコード (削除ではない) を挿入する機能です。

では、並べ替えとページング (別名スキップ) を有効にする、次のようなルーターがあるとします。

App.Router.map(function() {
    this.resource('messages', { path: '/messages/skip/:skip/sort/:sort/direction/:direction' });
});

App.MessagesRoute = Ember.Route.extend({

    model: function(params) {
        this.set('params', params);
        return this.query();
    },

    query: function() {
        var sort = {};
        sort[this.get('params').sort] = parseInt(this.get('params').direction);

        return App.Message.find({}, {
            skip: this.get('params').skip,
            sort: sort
        });
    },

    setupController: function(controller, model) {
        var self = this;
        this._super(controller, model);

        Ember.Instrumentation.subscribe('onMessage', {
            before: function(name, timestamp, message) {
                self.controller.set('content', self.query());
            },
            after: function() {}
        });
    },

});

これはうまく機能します-静的な意味で正しくソートおよびスキップします。

(注: 私は Ember データを使用していません - Ember オブジェクトのセットです。)

ただし、メッセージは継続的に到着するため、これらのメッセージの表示で、到着時に新しいメッセージを自動的に再クエリしたいと考えています。

それがいつ起こるかを教えてくれるウェブソケットがあり、それは正しく機能しており、Ember.Instrumentation インフラストラクチャを使用して、そのイベントを setupController クロージャーにルーティングしています。しかし、私がするとき

this.controller.set('content', this.query());

このリロード イベントに反応して、コンテンツはすべて消えます。私は何を間違っていますか?

4

2 に答える 2

4

1 つの方法は App.Message.find() を定期的に実行することだと思います - ember がビューの更新を処理します

window.setInterval(function(){App.Message.find()},1000);

間違っていたら訂正してください - 私はまだ ember を学んでいます

于 2013-06-12T18:24:33.080 に答える
3

エンバーの専門家に理由を教えてもらいたいのですが、私は最終的にこれを理解しました.

promises と then() を使用して実際の結果を取得し、それをコントローラーに設定すると、次のように動作します。

setupController: function(controller, model) {
    var self = this;
    this._super(controller, model);
    Ember.Instrumentation.subscribe('onMessage', {
        before: function(name, timestamp, message) {
            var p = self.query();

            p.then(function(response) {
                self.controller.set('content', response);
            });
        },
        after: function() {}
    });
},

その理由を知りたいです。なぜなら、Ember は実際の値に加えてプロミスを取ることができると思ったからです。とはいえ、REST 呼び出しのラウンドトリップ中に点滅がないため、このソリューションは実際には優れています。データは、それが完了したときにのみスワップされます。

于 2013-06-14T18:21:00.943 に答える