2010-05-26 45 views
0

我有兩個列表,一個在右側,一個在左側。當我點擊左邊的一個節點上執行以下操作:

1)AJAX請求$。員額是節點的內容 服務器

2)如果交易成功就 的服務器,節點通過jQuery

移動到列表 右側

要發佈到服務器:

$.post($(F).attr('action'), $(F).serialize(), null, "script"); 

將節點移動到另一個列表:

moveNode(element, to_list); 

「元素」和「to_list」是局部變量。我可以使moveNode成爲回調函數,但如果事務不成功,我將不得不發佈一堆錯誤消息,並且在我的代碼中變得笨拙。我也想讓服務器生成錯誤消息。

是否有任何方法將調用moveNode()放在服務器響應中?

回答

2

這是可能做你想要什麼,但我不會推薦它。具體方法如下:

function doTheThing() { 
    var element, to_list; 
    /* code here that gets element and to_list */ 

    // Modify the post to use a callback and the "text" data type 
    $.post($(F).attr('action'), $(F).serialize(), handleMove, "text"); 

    // Here's the callback 
    function handleMove(data) { 
     eval(data); 
    } 
} 

這工作,因爲eval是非常特殊的,它執行在它被稱爲(它以這種方式有點魔力)的範圍,所以在文本eval求值的代碼可以訪問所有範圍內的變量eval被調用。

稍微偏離主題,但我會推薦一種基於數據的方法。也許:

function doTheThing() { 
    var element, to_list; 
    /* code here that gets element and to_list */ 

    // Modify the post to use a callback and the "json" data type 
    $.post($(F).attr('action'), $(F).serialize(), handleMove, "json"); 

    // Here's the callback 
    function handleMove(data) { 
     if (data.errorMessage) { 
      /* ...show the error... */ 
     } 
     else { 
      moveNode(element, to_list); 
     } 
    } 
} 

...您的服務器或者返回:

{"errorMessage": "Don't move it!"} 

{"success": true} 

或任何有意義的環境。哎呀,如果它真的只是「它的工作」或「這是一個錯誤」,你可以使用一個文本協議,其中「OK」表示沒問題,其他任何東西都是錯誤信息(因特網上充滿了基於文本的協議) 。我更喜歡更多的結構,但重點是你有選擇。

我會發現這種方法更容易維護。當你開始在層之間來回傳遞代碼時,代碼依賴於知道範圍內變量的名稱,這似乎是一個主要的緊密耦合問題。

+1

'eval'幾乎總是一個壞主意。 – 2010-05-26 12:48:06

+1

這應該已經發生了,但是使用'「script」'的數據類型:http://github.com/jquery/jquery/blob/master/src/ajax。js#L669 – 2010-05-26 12:50:07

+0

這不適用於公共場所。那麼你最喜歡的方法是什麼? JSON?我的想法是,「劇本」已經在做這個。 – Dex 2010-05-26 12:50:09

1

你可以在回調(可能是json編碼)中解析來自服務器的響應,並帶有錯誤消息和布爾值來判斷事務是否成功。然後根據響應運行你的moveNode()。

$.post($(F).attr('action'), $(F).serialize(), function(response) { 
    if (response.successful) { 
    alert('yay'); 
    moveNode(element, to_list); 
    } else { 
    alert('Error: ' + response.error); 
    } 
}, "json");