2011-09-12 4 views
1

私はリアルタイムのコラボレーションスプレッドシート(​​ここではソース: https://github.com/omarbenhamid/Cloudsheet/blob/master/cloudsheet.opa)を作成するためにOPAを評価し、私は人々がスプレッドシート上でリアルタイムにcalloborateしたいOPAでは、Network.cloud( "key")への複数の呼び出しが、異なるページから異なる雲を返すのはなぜですか?

を、私は見てすべてのユーザーに最新情報を伝えるために、各スプレッドシートのためNetwork.cloudを作成したいですスプレッドシート。 keyboard_updateが、私は他の視聴者が更新されるように、スプレッドシートの雲にメッセージをブロードキャストする呼び出されると

各セルは<input type="text" onkeypress={event->keyboard_update(event,sheetname,row,column)}/>

です。しかし、ここで私の問題である:

keyboard_update(event,sheetname,row,column) = (
    Network.broadcast({/*my update notif message*/}, Network.cloud(sheetname)) 
) 

これは、新しいネットワークが各呼び出しでNetwork.cloudのさえThowさんAPIドキュメントを作成しているだけのように振る舞うと言う:

「一つまたは複数のサーバがネットワークを起動すると。

:同じ値kと雲(k)は、1つのネットワークだけが、実際に私が見つけた

唯一の解決策は、インデックスにグローバル可変に格納された連想リストの私の雲である「が作成され

clouds = Mutable.make([] : list((string,Network.network(message)))) 

そして、私のクラウドをList.assocを使ってフェッチし、必要に応じてインデックスに追加します(ソースコードのgetcloud関数を参照してください)。

Network.broadcastのパラメータとしてNetwork.cloud(sheetname)を使用する私の最初のアプローチはどうしてですか?

+0

しかし、本当にマルチプルクラウドを作成したい場合は、少なくとも特定のクラウドへの即時アクセスを使用するstringmap(Network.network(message))を使用する必要があります。 – Fred

+0

APIドキュメントを読むのでマップを使用しませんでした。文字列マップは不変です:不変のデータ構造です。私は誤解しましたか? –

+0

StringMapまたはListをMutableとして使用することの違いはないと思います。 – Fred

答えて

0

セルごとに新しいクラウドを作成する必要はありません。 あなただけの文書全体に対して1つのクラウドを作成する、または多分Webアプリケーション、および送信されたメッセージのdiferentタイプ持っている必要があります。たとえば

を:

type cloud_message = { 
    sheet_name : string 
    row : int 
    col : int 
    content : string 
} 

そして、唯一のトップで、一度雲を作成しますレベル:

@publish my_cloud = Network.cloud("my_cloud") : Network.network(cloud_message) 

そして最後に、あなたのkeyboard_updateで、呼び出し:

Network.broadcast({sheet_name=... row=... col=... content=...}, my_cloud) 
+0

確かに、1つのセルあたり1つのクラウドがありません。ドキュメントあたり1つのクラウドですが、複数のドキュメントがあるため、複数のクラウドが必要です。 –

+0

はい、Network.cloudが新しいクラウド呼び出しごとに。私の悪い。 – Fred

関連する問題