2009-08-23 16 views
2

ソート可能なリストに接続されたdraggablesのリストがあります。ドラッグ&ドロップは、ソートと同様に機能します。問題は、リストがソートされる前に、(レールを使用して)DBにレコードを作成する必要があることです。ですから、$ .postはうまくいきますが、挿入された要素のidを変更する必要があります。これを行うには、$ .postコールバックを使用して挿入された要素のIDを変更します。うまく動作しますが、ソート後に発生します。なぜ私がドラッグ可能なストップコールバックを使用しなかったのか疑問に思っているのなら、それは同じことなのですから。ここでは省略コード(取り外し無関係デシベルのもの)があります:ソート可能なソートの後に呼び出されるJQueryのドラッグ可能なコールバック

$("#operations_container").sortable({items:'.process_small', axis:'y', update: function(ev,ui) { 
    if (ui.item.attr('id').match("workcenter")) 
    { 
     $.post('/operations', 'fancyrailspoststuffignore', function(data) { 
        $("#operations_container > #workcenter_" + workcenterid).attr("id", "operation_" + data.operation.id); 
        }, "json"); 
    } 
    $.post('/jobs/sort/<%= @job.id %>', 'morefancyschamncyrailsjunk); 
}}); 

ソート可能なコンテナは単純です:

<div id="operations_container" class="in_grid"> 
</div> 

だから、すべてのコールバックが後ソートと呼ばれているように私には見えます。これは本当ですか?ソートの前にDOMを更新する必要がある場合、これを回避する方法はありますか?

更新:コメントに紛失した場合は、問題を示す画像とサンプルファイルがあります。

画像:http://dl.getdropbox.com/u/1826667/sortable.png サンプルファイル:http://dl.getdropbox.com/u/1826667/jquery_callback_order.zip

だから、ソート可能な更新がまだ最後に呼び出される前にコールバックは関係なく、常に彼らは(.postコールバック@と呼ばれている場所のいずれかの他のイベントの終わりで終わることが表示されます、など)。私はそれがJQueryで失敗しているとは思わない(私はそれが奇妙だと思うが)。私は、おそらくそれを行う方法ではありませんが、1つの行くにいくつかの投稿(彼らは共同依存しているので、必要ですが、レコードを作成し、並べ替える)をしようとしています。私はバックエンドでそれを回避しようとします(私はほとんど何かが働いているので)、私はこれを閉じたと考えます。この問題を助けてくれた皆様に感謝します。 SOのルール。

MEGAIMPORTANTUPDATE:それは機能しています!ショーンはそれを得た(答えを参照)と私はまだ少しばかげています。このことは数日経っています。みんなと特にShawnに感謝します。あなたは揺れる。

+0

問題が発生しています。 sortablesの順序が変更される前に#workcenter_43を#operation_64に変更したいのですか? –

+0

そうです。しかし、idを変更するコールバックはソート可能な変更の後に呼び出されます。 –

+0

私はそれを正確に行う方法はないと思います。多分私たちは回避策を見つけることができます。それはなぜあなたはそれを並べ替える前に呼び出す必要がありますか? –

答えて

2

Aha!とった。その絵は私が必要としていたものでした。ここで何をするのですか:

$("#operations_container").sortable({items:'.process_small', axis:'y', update: function(ev,ui) { 
    var sortDbTable = function(){ 
     $.post('/jobs/sort/<%= @job.id %>', 'morefancyschamncyrailsjunk); 
    } 
    if (ui.item.attr('id').match("workcenter")) 
    { 
      $.post('/operations', 'fancyrailspoststuffignore', function(data) { 
            $("#operations_container > #workcenter_" + workcenterid).attr("id", "operation_" + data.operation.id); //is there any reason you're not using the ui.item.attr("id",...) here? 
            sortDbTable(); //this will make sure id is changed before DB sort 
            }, "json"); 
    } else { //else not absolutely needed, but will make sure it's not unnecessarily sorted again 
     sortDbTable(); 
    } 
}}); 
+0

聖なる猿!そりゃ素晴らしい!それを入れて、完璧に動作します。それはまだそれを見て変だ(私は注文を示す警告がありますが)それは完璧に動作します!どうもありがとうございます。あなたは天才です。 –

+1

コールバックの順序だけではなく、実際には大きな問題がありました。それはAJAXの「非同期」部分です。これらのサーバーコールは、いつ返されるかについては保証されません。あなたはコードを開始し、コードは続行されます。サーバーからの応答(たとえば、ソート)の後に起こる必要があるものは、コールバックから呼び出す必要があります。 –

0

更新イベントの前に、開始イベントが呼び出されます。これを使用できます。

+0

ええ、私はそれを見ました(ほとんどすべてのコールバック実際に)。しかし、ユーザーがソート可能な要素をドロップしないとレコードを作成できません。:) 私は関係なくそれを作成し、未使用の場合はそれを削除するというアイデアでおもしろかったが、それはちょうど間違っていたようだ。 –

+0

代わりにドラッグ可能なstop()イベントに接続しようとしましたか? –

+0

ええ、それは実際に私が使用した最初のコールバックです(より意味があるため)。しかしそれはソートの後にも呼び出されるので、私はソート可能なコールバックに関数を注入してコールバックの順序を強制し始めました。まだ試しています... –

関連する問題