2

現在、サーバー側でリフトを使用し、すべての視覚化に d3 (javascript 視覚化フレームワーク) を使用してグラフ視覚化ツールを実装しています。私が抱えている問題は、スクリプトでサーバーからセッション依存のデータを取得したいということです。

基本的に、私の目的は、リフト有効な ajax コールバックを静的 js スクリプトで記述することです。

これまでに試したこと

最善の解決策が私がすでに試したものであると思われる場合は、詳細な回答を投稿して、それを正確に使用する方法と、問題を完全に解決する方法を教えてください。

リフトを使用して別のスクリプトに ajax コールバックを記述し、メイン スクリプトから呼び出す

隠しテキスト入力に似たこのソリューションは、おそらく機能する可能性が高くなります。ただし、エレガントではなく、ロード時に多くのスクリプトをロードする必要があり、あまり便利ではありません。

これは、メーリング リストのこのディスカッションで説明されているように、lift コミュニティで推奨されるソリューションの 1 つです。

REST インターフェイス

通常、lift で JavaScript 関数からデータを取得するために行うことは、REST インターフェースを作成することです。ただし、このインターフェイスはどのセッションにもリンクされません。これは、以前の質問から得た解決策です: Get json data in d3 from lift snippet

スクリプトの引数として関数を与える

別の解決策は、グラフを生成するために呼び出されるメイン スクリプトの引数として ajaxcallback を指定することです。ただし、多くのコールバックがあると予想され、スクリプトの引数をいじる必要はありません。

Lift でスクリプト全体を作成し、それをクライアントに提供する

このソリューションは洗練されたものになる可能性がありますが、私のスクリプトは非常に長いので、静的なままにしておきたいと思います。

私が欲しいもの

クライアント側

私の Web ページのソース コードを確認しているときに、ajaxSelect のコールバックが次のようになっていることがわかりました。

<select onchange="liftAjax.lift_ajaxHandler('F966066257023LYKF4=' + encodeURIComponent(this.value), null, null, null)" name="F96606625703QXTSWU" id="node_delete" class="input">

さらに、Web ページの最後にページの状態を含む変数があります。

var lift_page = "F96606625700QRXLDO";

liftAjax.lift_ajaxHandlerしたがって、この関数を使用して ajaxcall が有効であることをシミュレートできるかどうか疑問に思っています。ただし、使用する正確なシンタックスはわかりません。

サーバー側

クライアント側でリクエストを「偽造」したので、クライアント側でリクエストを取得し、正しい関数にディスパッチしたいと思います。これは、LiftRules.dispatchオブジェクトが最適なソリューションと思われる場所です。オブジェクトが呼び出されると、すべてのセッション管理が行われます (リクエストが認証され、セッションにリンクされます)。append関数。

述べる

Lift では、セキュリティを強化するために、変数のすべての名前がランダムな文字列に変更されます。おそらく、JavaScript にこれらの値を「与える」必要があることを意味する場合でも、アプリケーションで同じ動作をしたいと考えています。ただし、15 個の文字列値の配列は、javascript 関数の引数として 15 個の関数よりも優れたトレードオフです。

編集

私の研究をたどっているときに、このページを見つけました:サーバー関数をクライアントアクションにマッピングすることで、名前付き関数の目標を何らかの形で説明していますが、それが機能するソリューションにつながらなかったとしても。

4

1 に答える 1

6

素早い回答

Rest in Lift はステートレスである必要はありません。RestHelper を LiftRules.dispatch.append に登録すると、ステートフルに処理され、通常どおり S オブジェクトを介してセッション情報を利用できるようになります。

長い答え

興味があるようで、前に SO に出てきたので、Lift でサーバー側関数がどのように登録され、呼び出されるかについて、より詳細な説明を次に示します。しばらく Lift を使用していない場合は、目をそらしてください。以下は、リフトまたはその複雑さを評価するために決して使用しないでください。これは純粋にライブラリ開発者レベルのものであり、Lift ユーザーの大部分は、それを意識せずに開発に取り組んでいます。

使い方

通常、SHtml オブジェクト内のメソッドを使用してステートフル コールバックを作成する場合、実際に行っているのは、ユーザー セッションのコンテキスト内で S.AFuncHolder 型のオブジェクトを登録し、それぞれに一意の ID を付けることです。このプロセス中に生成された一意の ID は、次のようなパターンに遭遇したときに表示されるものです。F96606625700QRXLDO. フォーム ポストや ajax などを介してデータが送信されると、Lift はこれらの関数 ID のリクエストをチェックし、関連する関数が存在する場合はそれを実行します。S.SFuncHolder (単一の文字列クエリ パラメータを受け入れる) や S.BinFuncHolder (パラメータはマルチパート フォーム データ) など、より具体的なタイプの AFuncHolder を提供するヘルパーがいくつかありますが、それらはすべて Any を返し、バックグラウンドで Lift がこれらの戻り値を収集します適切なタイプの応答を作成します。たとえば、JsCmd は、コマンドを実行する JavaScriptResponse になります。LiftResponse を直接返すこともできます。

それの使い方

AFuncHolders は S.fmapFunc メソッドを使用して登録されます。あなたはそれをこのように呼ぶでしょう

S.fmapFunc(SFuncHolder({ (str: String) =>
  doSomethingAwesomeWithAString(str)
}))(id => <input type="text" name={id} value=""/>)

最初のパラメーターは適切な *FuncHolder 型にラップされた関数で、2 番目のパラメーターは生成された id を受け取り、何かを出力する関数です。出力を取得するものは、ページに含めるものです。関数が実行されるように、何らかの形でIDがクエリパラメーターとしてサーバーに送信されるはずです。

すべてを一緒に入れて

上記を使用して独自の Ajax 呼び出しを行うこともできますが、Lift が ajax 呼び出しを行う場合、他にも考慮すべき点がいくつかあります。

1) ほとんどのブラウザーは、特定のドメインへの同時接続を非常に多く許可します。3 はマジック ナンバーのようです。2) AFuncHolders は、含まれているスニペットのスコープを閉じることが多く、複数の ajax リクエストがそれぞれ独自のスレッドで一度に処理されると、悪いことが起こる可能性があります。

これらの問題に対処するために、liftAjax.lift_ajaxHandler関数は各 ajax 要求をキューに入れ、一度に 1 つのみがサーバーに送信されるようにします。

このアプローチの欠点は、結果をコールバックに渡す必要がある Ajax 呼び出しを行うことが困難になる可能性があることです。たとえば、JQuery オートコンプリートは、入力が変更されたときに一致のリストを受け入れるコールバック関数を提供します。ただし、LiftAjax.lift_ajaxHandler を手動で呼び出す場合は、成功とエラーのための独自のコールバック関数を提供できます。ブラウザーでこれらの関数のソースを参照して、関数の動作に関する詳細を確認することをお勧めします。

Lift が ajax コールバックで RequestVars を復元する方法など、実際にはもっと多くのことがあります (ここで lift_page が登場しますが、土曜日の朝にコーヒーを飲みながら説明する準備ができているのはそれだけです :)

あなたのアプリで頑張ってください!

于 2012-11-17T16:39:13.767 に答える