2010-08-11 32 views
14

Tôi đang sử dụng tiện ích con Giao diện người dùng tự động hoàn tất cho biểu mẫu để cho phép người dùng nhập tên khách hàng. Ý tưởng là họ có thể chọn một khách hàng hiện có và điền vào các trường khác trong biểu mẫu hoặc họ có thể tự do nhập một khách hàng mới được tạo. Khi người dùng chọn một khách hàng hiện tại, tôi sử dụng sự kiện select để điền một đầu vào bị ẩn để lưu trữ ID được liên kết với khách hàng đó. Vấn đề tôi gặp phải là nếu người dùng lần đầu tiên chọn một khách hàng từ danh sách nhưng sau đó đi vào và chỉnh sửa văn bản, có hiệu lực khi tạo khách hàng mới, tôi cần phải có thể xóa giá trị ID đầu vào bị ẩn .Sự kiện thay đổi tự động hoàn thành giao diện người dùng JQuery - đặt lại ID lựa chọn

tôi gọi this SO question và tạo ra đoạn mã sau:

$(function() { 
      $("#customerName").autocomplete({ 
       source: "/Customers/CustomerListJSON", 
       minLength: 2, 
       select: function(event, ui) { 
        $("#customerId").val(ui.item ? ui.item.Id : ""); 
       }, 
       change: function(event, ui) { 
        try { 
         $("#trace").append(document.createTextNode(event.originalEvent.type + ", ")); 
         if (event.originalEvent.type != "menuselected") 
          $("#customerId").val(""); 
        } catch (err) { 
         $("#customerId").val(""); 
        } 
       } 
      }); 
     }); 

Vấn đề là sự kiện thay đổi được bắn vào blur, vì vậy nếu người dùng chọn một khách hàng, giá trị nhập ẩn được phổ biến, nhưng như ngay sau khi họ di chuyển tiêu điểm ra khỏi hộp đầu vào, nó sẽ bị xóa ngay lập tức. Tuy nhiên, nếu tôi loại trừ sự kiện blur khỏi thử nghiệm event.originalEvent.type, thì giá trị của trường ẩn sẽ không bao giờ được đặt lại trong trường hợp ban đầu mà người dùng chỉnh sửa giá trị đã chọn trước đó.

Có ai đã giải quyết vấn đề này trước đây không, và nếu có, bạn có thể cung cấp một số hướng dẫn về cách tôi có thể quản lý giá trị của đầu vào bị ẩn đó để nó được điền chỉ khi một mục được chọn từ danh sách và xóa với bất kỳ giá trị nào khác?

Trả lời

29

Dường như tôi đã tự giải quyết vấn đề này một cách nhanh chóng. Đề cập đến JQuery UI wiki, các ui mục trong trường hợp change là một giống trong trường hợp select, vì vậy tôi có thể sửa đổi mã của tôi để đọc như thế này:

$(function() { 
    $("#customerName").autocomplete({ 
     source: "/Customers/CustomerListJSON", 
     minLength: 2, 
     select: function(event, ui) { 
      $("#customerOrganizationId").val(ui.item ? ui.item.Id : ""); 
     }, 
     change: function(event, ui) { 
      $("#customerOrganizationId").val(ui.item ? ui.item.Id : ""); 
     } 
    }); 
}); 

Không cần để kiểm tra cho sự kiện này, chỉ dành riêng cho cho dù có một mục trong đối số ui. Cài đặt ID trong sự kiện select có thể là dư thừa, nhưng để an toàn, tôi sẽ giữ cả hai.

+0

Cool! Tôi có nhu cầu tương tự nhưng bây giờ tôi cần nhiều autocomplete, vì vậy ví dụ nếu tôi chọn 'customer1' id của mình sẽ được đặt trong trường ẩn bây giờ tôi gõ' abcd' bây giờ một lần nữa tôi kích hoạt autocomplete và tôi chọn 'customer2' id nên được đẩy, bây giờ nếu tôi loại bỏ 'customer2' chỉ id của mình nên được loại bỏ khỏi danh sách ẩn, bất kỳ suy nghĩ nhanh chóng? –

+0

Có vẻ như bạn đang tìm kiếm thứ gì đó giống như các công cụ gắn thẻ. Công cụ tự động hoàn thành sẽ làm điều này, nhưng nó không đẹp. Tôi thích một cái gì đó như thế này: http://webspirited.com/tagit/#demos. Có một vài điều khiển như thế này ... Tagit chỉ là một trong những tôi đã sử dụng trong quá khứ với thành công. –

+0

Nó giúp nhưng cũng phải có nội dung, vì vậy nếu tôi sử dụng chuỗi kích hoạt, nó sẽ kích hoạt tự động hoàn thành không nếu không –

0
$(function() { 
$("#customerName").autocomplete({ 
    source: "/Customers/CustomerListJSON", 
    minLength: 2, 
    select: function(event, ui) { 
     $("#customerId").val(ui.item ? ui.item.Id : ""); 
    }, 
    change: function(event, ui) { 
     try { 
      $("#trace").append(document.createTextNode(event.originalEvent.type + ", ")); 
      if (event.originalEvent.type != "menuselected") 
       $("#customerId").val(""); 
     } catch (err) { 
      $("#customerId").val(""); 
     } 
    } 
}); 
}); 
Các vấn đề liên quan