2013-08-19 31 views
7

我有一個jQuery UI排序列表元素,從Ajax請求動態填充。jQuery UI可排序 - 錯誤:無法在初始化之前調用可排序的方法;試圖調用方法'禁用'

目前,工作流去

  1. 用戶點擊按鈕,列表中填充,並通過指定的設置進行排序。
  2. 用戶點擊另一按鈕,
    1. 現有列表<li>元件由jQuery.empty()呼叫擦除
    2. 新的數據值插入到新<li>列表元素和附加到<ul>列表
    3. 排序列表經由$(刷新」 #sortable 「)排序(」 刷新「);

給定一個排序列表對象$("#avail_list").sortable(...);,我希望能有具體的列表元素draggable財產禁止和不透明度設置爲0.5基礎上的其他元素現有的值。

要做到這一點,我有以下功能:

var disabled = []; 
var appendString = "" 
if (avail.length > 0) { 
    for (var i = 0; i < avail.length; i++) { 

    //check if current list element exists in existing value list. True results 
    //in grayed out and non-draggable element 
    compareMatch = checkMatch(avail[i], compare); 

    if (compareMatch) 
     disabled.push(list + "open_" + avail[i].id); 


    appendString += "<li id = "+ list + "open_" + avail[i].id + 
     " class = 'avail_list_element'><img class = 'logo' src = /static/images/vendor_logo/" + avail[i].icon + " /></li>" 
    } 

    $("#avail_list").append(appendString); 

} 

$("#avail_list").sortable("refresh"); 

if (disabled.length > 0) 
    disableDraggable(disabled); 

function disableDraggable(elements){ 
    for (var i = 0; i < elements.length; i++) { 
    console.log(elements[i]) 
    $("#" + elements[i]).sortable("disable"); 
    $("#" + elements[i]).fadeTo("fast", 0.5); 
    } 
} 

然而,這會導致錯誤

Error: cannot call methods on sortable prior to initialization; 
attempted to call method 'disable' 

因爲我致殘的元素之前被調用排序名單上refresh,如何sortable對象可以不被初始化嗎?

+0

你打電話'$(「#avail_list」)'排序,但你的元素數組將包含類似'$(「#listopen_1」)'雖然我不知道究竟是因爲我不知道'list'變量被設置爲什麼。也許嘗試添加'$(「#」+ elements [i])。sortable(「refresh」);'嘗試禁用之前? – JLewkovich

回答

8

在任何元素上調用.sortable()會使該元素的子元素可排序。這並不意味着孩子也用.sortable()初始化。它們只是可以拖動的可分類容器的一部分。

而且由於您在子元素上調用.sortable('disable'),它會給出一個錯誤,因爲在父級調用了.sortable()而不是子級。而你禁用的方式也是不正確的。使用cancel property排除這些元素以進行排序。在初始化可排序的任何位置添加此選項。

$("#avail_list").sortable({ 
    cancel: ".disable-sort" 
}); 

然後將那個類添加到那些要禁用的元素。

function disableDraggable(elements){ 
    for (var i = 0; i < elements.length; i++) { 
    $("#" + elements[i]).addClass("disable-sort"); 
    $("#" + elements[i]).fadeTo("fast", 0.5); 
    } 
} 
相關問題