2016-12-02 10 views
1

私はember-cli-chart(ChartJSラッパー)を使用して時系列データをグラフに表示するWebアプリケーションを開発中です。私はsocket.ioを使用して現在のデータをWebアプリケーションに送信して表示します。Emberオブジェクト内のEmberjsバインディングプロパティ

socket.on('timeSeriesData', function(data){ 
    chart1.set('outdoorTemp', data); //Sets data on signal from socket.io 
}); 

var chart1 = Ember.Object.create({ 
outdoorTemp: null, //This variable is successfully set on the signal above 
data: { 
    labels: [], //Don't need labels for now 
    datasets: [ 
     { 
      label: "Energy Consumption in KW/H", 
      fillColor: "rgba(219, 66, 0, .25)", 
      strokeColor: "rgba(209, 0, 0, 1)", 
      pointColor: "rgba(209, 0, 0, 1)", 
      pointStrokeColor: "#fff", 
      pointHighlightFill: "#fff", 
      pointHighlightStroke: "rgba(209, 0, 0, 1)", 
      data: Ember.computed.alias('outdoorTemp') //This value does not get set to outdoorTemp 
     } 
    ] 
}, 
options: { 
    responsive: true, 
    maintainAspectRatio: false, 
    scaleFontColor: '#fff', 
    scaleShowGridLines: false, 
    scales: { 
     yAxes: [{ 
      scaleLabel: { 
       display: true, 
       labelString: 'probability' 
      } 
     }] 
    } 
}}); 

ここでの目標は、新しいデータがsocket.ioから受信されるたびにリアルタイムでグラフを更新することでした。私はchart1オブジェクト内のoutdoorTempプロパティにデータプロパティをバインドしようとしていますが、このデータバインディングは機能していないようです。私はこの問題に関する文書を読んだが、私がやっていることはうまくいくはずだが、そうではないようだ。この問題に対するより洗練された解決策がありますか?

答えて

0

これはネストされた構造に関連しています。計算されたプロパティはローカルオブジェクトにスコープされます。この場合、エイリアスはlabelfillColorなどで動作しますが、その親には到達できません。

私はこれを示し燃えさし責め作成:私も値を設定するためのオブザーバを使用して責めで解決策を示して

https://ember-twiddle.com/a91df745677ba49b5d12c9575d7dca19?openFiles=controllers.application.js%2C

を。直接設定することもできますが、中間の関数設定でデータがどのように送信されるのかを判断するのに役立ちます。

// called on init, and for any subsequent changes 
setDynamic: Ember.on('init', Ember.observer('appName', function() { 
     this.set('nested.observed', this.get('appName')); 
})) 

Emberのオブザーバーは、特に境界を越えているものを観察すると危険です。このオブザーバはローカルであり、観測されないデータのみを設定するため、これはオブザーバの最悪の場合ではありません。オブザーバーを使用しないか、またはsocket.onの値を設定しない方が良い解決策があるかもしれませんが、少なくともこれはEmberの「データダウン、アクションアップ」アイデアの次のものです。

dataルートプロパティ全体を計算プロパティにしてオブジェクトを返すことができますが、これは単一の変更を気にするだけの計算であり、おそらく全体的に高価になります。

+0

ありがとうございました!これは私が持っていた問題を修正しましたが、新しい問題を明らかにしました。データがsocket.io関数で変更されていないため、オブザーバがトリガされることはありません。 socket.ioシグナルが受信されると、chart1.set( 'outdoorTemp'、data);それは常にnullとして読み取るので、実際にはその値を変更していないようです。なぜこれが起こっているのか分かりません。 –

+0

'chart1' emberオブジェクトではnullと読み込まれますか?または、socket.ioの中からヌルとして読み込まれていますか? Emberは、あなたがしているように見える '.set()'を使って変更を引き起こします。私は5秒後にappNameを変更するために回転を更新しました。これは、オブザーバがまだトリガしていることを示しています。基本的には、ソケットioコールバックに新しい値が入っていることを確認してください。 –

+0

chart1.get( 'outdoorTemp')を実行でき、適切なデータが返されるため、outdoorTemp値が設定されているようです。この問題は、何らかの理由でオブザーバーが変更を気付かずに実行されないことが原因と思われます。私があなたのツイールドコードと私の間に気づいた1つの違いは、あなたのコードがコントローラーでそれを行う間、私はemberオブジェクトでこれをやっているということです。これはおそらく問題だろうか? –

関連する問題