2016-12-21 19 views
6

Tôi đã làm việc với typeahead.js và tải dữ liệu bằng cách sử dụng tùy chọn BloodHound remote.Ngăn chặn cuộc gọi ajax trên không gian trống typeahead.js

Mọi thứ đều hoạt động như dự kiến ​​ngoại trừ khi tôi nhập only spaces vào textbox typeahead still sends ajax call.

Tôi muốn biết nếu có cách nào để prevent ajax call nếu có only spaces trong hộp văn bản. Tôi đang tìm kiếm hành vi tương tự như trim.

Đây là mã của tôi. Tôi đã cố gắng sử dụng chức năng prepare nhưng không có may mắn.

var dataSource = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('ProductID', 'ProductName'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    remote: { 
       url: urlVar + "LoadAllProductByProductName/%QUERY", 
       wildcard: '%QUERY', 

      }, 
    sufficient: 3, 
    }); 

const $tagsInput = $('.txtProductName') 
$tagsInput.typeahead({ 
    minLength: 3, 
    source: dataSource, 
    hint: false, 
    highlight: true, 
    isBlankString: false 
    }, 
    { 
     limit: 10, 
     source: dataSource, 
     name: 'dataSource', 
     display: function (item) { 
     return item.ProductName 
     }, 
     suggestion: function (data) { 
     return '<div>' + data.ProductName + '–' + data.ProductID + '</div>' 
     }, 

}); 
+0

tại sao lại xảy ra sự cố khi gửi cuộc gọi khi có khoảng trắng? Có lẽ người dùng sẽ không nhận được kết quả nào. – ADyson

+0

Tôi muốn tránh chuyến đi mạng. – Mairaj

+3

cho rằng một chuyến đi mạng được tạo ra mỗi lần người dùng gõ _anything_ nơi có nhiều hơn 3 ký tự và cơ hội người dùng thực sự nhập 3 khoảng trống (họ không có khả năng nghĩ rằng nó sẽ trả về bất kỳ thứ gì!), Bạn có thể đi rất nhiều nỗ lực và giảm lưu lượng truy cập mạng của bạn xuống 0,0001%. Chỉ cần nói nó có vẻ hơi vô nghĩa. Nhưng nếu bạn thực sự muốn, bạn có thể tạo một hàm tùy chỉnh cho thuộc tính 'source' và ngăn yêu cầu đi trước tại điểm đó dựa trên các cụm từ tìm kiếm (và chỉ trả lại một mảng trống). Các tài liệu về typeahead hiển thị chữ ký phương thức – ADyson

Trả lời

1

Thuộc tính remote có chức năng prepare mà bạn có thể sử dụng tay cầm thay đổi này trước khi cuộc gọi đi qua dây dẫn.

Như một ví dụ:

function createBloodHoundConfig(options) { 
    return { 
     datumTokenizer: Bloodhound.tokenizers.obj.whitespace('Name'), 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     identify: options.identify, 
     sufficient: 8, 
     remote: { 
      url: options.url, 
      prepare: function (query, settings) { 
       settings.url = settings.url.replace("{q}", query.trim()); 
       return settings; 
      } 
     }, 
    }; 
} 

Lưu ý rằng trong trường hợp này bạn không cung cấp các wildcard bất động sản, vì nó là một cách hiệu quả một cách viết tắt để thực hiện thay thế tượng trưng.

+0

Điều này không ngăn được cuộc gọi. Nó chỉ đơn giản là 'cắt' những gì được tìm kiếm. – ndn

4

tôi sẽ cố gắng gắn một sự kiện KeyUp vào hộp văn bản để thực hiện việc lọc:

$tagsInput.keyup(function(){ 
     this.value = this.value.replace(/ */, ' '); 
    }); 

Đó sẽ cháy sau khi không gian thứ hai, mà nên giảm thiểu những hành vi không mong muốn nếu không có các ký tự không gian trong lĩnh vực, là tốt.

+0

tôi nghĩ rằng đây là cách có thể – plonknimbuzz

+0

Thậm chí nếu nó hoạt động, nó không phải là loại giải pháp tôi đang tìm kiếm. Nếu bạn chắc chắn không có cách nào để làm điều đó, tôi thích điều đó như một câu trả lời. – ndn

Các vấn đề liên quan