2017-10-03 1 views
0

私はapplication.jsコントローラでライブ値のデータを取得するwebsocket接続を持っています。接続を初期化し、データをすべてのページからアクセスし、すべてのページの読み込みを再接続しないようにするために、ここに挿入します。Emberコントローラのデータが他の場所からアクセスされた

他のコントローラやテンプレートからこのデータにアクセスする方法はわかりません。

2つのやりたいこと: 1)ナビゲーションバーのすべてのページで値を確認し、動的価格を更新します。 2)他のコントローラのwebsocketデータにアクセスします。これがapplication.jsですでに定義されているメッセージハンドラに影響するかどうかはわかりません。私はイベントデータが変数になるはずだと思います。

application.jsイニシャライザとサービス拡張になってしまった

headerPrice: 0, 

setupWebsocket: function() { 
    this._super(); 
    var socket = this.get('websockets').socketFor('ws://localhost:7000/'); 
    socket.on('open', this.myOpenHandler, this); 
    socket.on('message', this.myMessageHandler, this); 
    socket.on('close', function(event) { 
    console.log('Websocket closed'); 
    }, this); 
}.on('init'), 

myOpenHandler: function(event) { 
    console.log('Websocket Opened: ' + JSON.stringify(event)); 
}, 

myMessageHandler: function(event) { 
    if (event.data == "foo") { 
    this.headerPrice = event.data.price; 
    }; 
} 

}

+4

代わりにサービスを使用してください! – Lux

+1

ありがとう、行く道だった。途中で束を学んでいる間に研ぎ澄まされ、働いています。 –

答えて

0

(エンバー-のWebSocketは既にサービスです)。

イニシャライザ:

export function initialize(app) { 
    app.register('websocket:main', 'websocket', { instantiate: true, singleton: true }); 
    app.inject('controller', 'websocket', 'service:websocket'); 
    app.inject('component', 'websocket', 'service:websocket'); 
} 

export default { 
    name: 'websocket', 
    initialize: initialize 
}; 

サービス:

import websocket from 'ember-websockets/services/websockets'; 

export default websocket.extend({ 
    init: function() { 
    this._super.apply(this, arguments); 

    var socket = this.socketFor('ws://localhost:7000', ['echo-protocol']); 
    console.log('initializing websocket...'); 
    socket.on('open', this.myOpenHandler, this); 
    socket.on('message', this.myMessageHandler, this); 
    ..... 
+1

小さな提案は、 'inject.service' APIをイニシャライザに注入するのではなく明示的に使用してください。ファイルを開いたときにコントローラが利用できるサービスがわかり、プロパティの上書きを避けることができます。 – locks

関連する問題