2013-09-07 29 views
9

Tôi đang cố gắng hiểu sự khác biệt giữa renderItemrenderItemData.Sự khác biệt giữa hàm renderItem của jQuery tự động hoàn thành và renderItemData

Tôi không thể tìm thấy tài liệu liên quan về điều này.

tôi có mã sau đây:

$.widget("custom.catcomplete", $.ui.autocomplete, { 
    _renderMenu: function(ul, items) { 
    var that = this, 
    currentCategory = ""; 
    $.each(items, function(index, item) { 
     if (item.category != currentCategory) { 
     ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>"); 
     currentCategory = item.category; 
     } 
     // with following code, when an element is selected 
     // in menu list, the corresponding value appears in searchbox 
     that._renderItemData(ul, item); 
     // with following code, when an element is selected 
     // in menu list, the corresponding value does NOT appear in searchbox 
     // I override renderItem below 
     **// that._renderItem(ul, item);** 

    }); 
    } 
}); 

function handleSearchBox() { 

    var data = [ 
    { label: "JAMES", category: "PEOPLE" }, 
    ]; 

    $("#search").catcomplete({ 
    delay: 0, 
    source: data, 
    select: function(event, ui) { 
     event.preventDefault(); 
     str = JSON.stringify(ui) 
     // with renderItemData, str = item in source data 
     // with renderItem str = {} 
     alert(str) 
     var selectedObj = ui.item.label 
     $("#search").val(selectedObj); 
    } 
    }); 
$("#search").data("custom-catcomplete")._renderItem = function(ul, item) { 
       return $("<li></li>").data("item.autocomplete", item) 
        .append("<a>" + item.label + "</a>") 
        .appendTo(ul); 
      }; 

} 

Mục tiêu của tôi là để phong cách tùy chỉnh các mục menu li. Tôi không chắc mình đang đi sai đâu.

+0

'renderItem' là một phương pháp, ' renderItemData' là một đối tượng. Bạn không cần phải tương tác với 'renderItemData'. – Anthony

+0

Tôi đã thêm giải thích dưới đây, nếu bạn chỉ muốn sử dụng _renderItem thì bạn cần đặt dữ liệu là 'ui-autocomplete-item' chứ không phải' item.autocomplete' –

+0

Tôi nghĩ tôi đã làm việc đó. Tôi đang cố gắng để hiểu nó nhiều hơn/tốt hơn. Tôi sẽ sớm chấp nhận câu trả lời. cảm ơn rất nhiều. điều này có ích – GJain

Trả lời

14

renderItem xây dựng các mục trong danh sách thực tế (<li>) mà là để được nối thêm vào danh sách kết quả

renderItemData chỉ là một phương pháp wrapper mà các cuộc gọi renderItem và lưu trữ các dữ liệu liên quan (nhãn và giá trị) để các yếu tố tạo ra. Dữ liệu này sau đó được sử dụng khi điều hướng và chọn và tùy chọn từ hộp đề xuất.

Bạn sẽ thấy rằng các mã nguồn cho cả hai là khá đơn giản:

_renderItemData: function(ul, item) { 
    return this._renderItem(ul, item).data("ui-autocomplete-item", item); 
}, 

_renderItem: function(ul, item) { 
    return $("<li>") 
     .append($("<a>").text(item.label)) 
     .appendTo(ul); 
}, 

Và bạn nên lưu ý rằng _renderMenu thực sự kêu gọi _renderItemData:

_renderMenu: function(ul, items) { 
    var that = this; 
    $.each(items, function(index, item) { 
     that._renderItemData(ul, item); 
    }); 
}, 
Các vấn đề liên quan