2011-12-15 16 views
3

私は比較的javascriptのすべての複雑さに慣れているので、おそらくこのタイミングの問題は、イベントハンドリングのために有効なJavaScriptをプログラムする方法がわかりません。 。

1つのページに2つのSignalRハブを使用しています。 1つはチャットハブで、100%の時間で動作します。もう1つは、いくつかのRaphael jsオブジェクトと共に使用されており、問題が発生しています。

raphael circleオブジェクトの1つでclickイベントが発生しています。画面がロードされた直後にクリックすると、C#のハブメソッドが呼び出されません。これが起こると、Chromeの開発ツールのコンソールのエラーは「SignalR:データを送信する前に接続を開始する必要があります。 .sent()の前に.start()を呼び出す "ハブのcsメソッドを呼び出すjavascriptイベントは常に呼び出されます。奇妙なことは、私が数秒待つと、csハブメソッドはいつも期待どおりに動作するように見えるということです。ハブイベントをロードするのに数秒かかります。他の誰かがこのようなシナリオに遭遇したことはありますか?

$(document).ready(function(){...でも、jaコードが実行されるまでRaphael jsオブジェクトはdomの一部ではないので、私はそれを推測しています。ロードするためにそれらを強制しないでしょう。

$(document).ready(function() { 
    var clientHub = $.connection.tableHub; 

    var canvas = Raphael((innerWidth/2) + 83, (innerHeight/2) - 194, 74, 74); 
    var circle1 = seat1Canvas.circle(37, 37, 35); 
    var circle1Text = seat1Canvas.text(37, 37, "Open"); 

    var buildCircleAndSendToClients = function() { 
     clientHub.buildCircle(identity.Name); 
    }; 

    var drawAvailableCircle = function() { 
     circle1 = seat1Canvas.circle(37, 37, 35); 
     circle1Text = seat1Canvas.text(37, 37, "Sit\nHere"); 
     circle1.attr("fill", "#fffeee"); 
     circle1.attr("stroke", "black"); 
     circle1.attr("stroke-width", 3); 
     circle1.mousedown(buildCircleAndSendToClients); 
    }; 

    circle1.attr("fill", "#eeefff"); 
    circle1.attr("stroke", "black"); 
    circle1.attr("stroke-width", 3); 
    circle1.mouseover(drawAvailableCircle); 

    clientHub.drawCircle = function(username) { 
     circle1 = seat1Canvas.circle(37, 37, 35); 
     circle1Text = seat1Canvas.text(37, 37, username); 
     circle1.attr("fill", "#eeefff"); 
     circle1.attr("stroke", "black"); 
     circle1.attr("stroke-width", 3); 
    }; 

    $.connection.hub.start(); 
}); 
+0

Raphael.jsオブジェクトがインスタンス化された後に、フックできるイベントはありますか? – Brian

+0

何かOnElementCreatedイベントのようなもの?よく分かりません。私はRaphael jsにもとても新しいですが、私は見ていきます。私は別の方向から何かが必要だと思っている。ハブとの接続が確立されたら、マウスオーバーとクリックのイベントでRaphaelオブジェクトを構築します。 – MadDogMcFie

答えて

5

あなたはstartメソッドにパラメータとして渡すコールバック関数へのSignalR接続と相互作用するハンドラのためにあなたのwireupを移動する必要があります。これは、ハンドラが上がらないことを確認しますハブ接続が開始されるまでアクティブではありません。コールバックが実行されるまでUIを少し変更したい場合があります。たとえば、ボタンをデフォルトで無効にし、ハンドラが有線になったら有効にします。

例えば:

$ .connection.hub.start(関数(){// wireupハンドラここ UIを有効})。

+0

ええと - これはまさに私がダミアンを探していたものです。ありがとうございました。 – MadDogMcFie