2017-09-13 5 views
9

Jquery의 Selectize 태그 라이브러리가 사용 중이며 지금까지는 잘 작동합니다.Jquery 선택 Ajax의 옵션 상단에있는 "모두 지우기"링크를 추가하십시오.

아래 코드는 제가 사용한 코드입니다.

자바 스크립트 코드 :

$('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: true,  
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 
     $(".selectize-input input[placeholder]").attr("style", "width: 100%;"); 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       console.log(res.properties); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 

PHP 코드 :

/* API for autocomplete list of properties */ 
Route::post('/search-property-autocomplete', function() { 
    if (!empty(trim($_POST['q']))) { 
     $search_term = trim($_POST['q']); 


     // getting Suburb State and Postcode of the properties based on search 
     $query = Property::join('technobrave_suburbs_', function($join) { 

        $join->on('technobrave_properties_.suburb_id', '=', 'technobrave_suburbs_.id'); 
       }); 

     $query->join('technobrave_states_', function($join) { 
      $join->on('technobrave_properties_.state_id', '=', 'technobrave_states_.id'); 
     }); 


     $query->select('technobrave_properties_.*', 'technobrave_suburbs_.suburb', 'technobrave_states_.state_name'); 

     $query->where(function($query) use ($search_term) { 
      $query->where('technobrave_properties_.post_code', 'LIKE', '%' . $search_term . '%'); 
      $query->orwhere('technobrave_suburbs_.suburb', 'LIKE', '%' . $search_term . '%'); 
      $query->orwhere('technobrave_states_.state_name', 'LIKE', '%' . $search_term . '%'); 
     }); 
     $data = $query->take(8)->get(); // getting maximum 8 records only 

     if ($data) { 
      foreach ($data as $current_record) { 
       $result[] = array(
        'address' => $current_record->suburb . ' ' . $current_record->state_name . ' ' . $current_record->post_code 
       ); 
      } 
     } 
    } else { 
     $result = []; 
    } 
    echo json_encode(array('properties' => $result)); 
}); 

당신이 위의 코드에서 볼 수 있듯이, 나는 데이터를 채우기 위해 Ajax를 사용하여 내 PHP를 호출하여 기록을 얻고있다 기능은 절대적으로 잘 작동합니다.

이제 모든 결과 상단에 하이퍼 링크로 하나의 항목을 추가하고 싶습니다. 모두 지우기 입력 상자를 검색하거나 입력 할 때마다이 표시됩니다.

모두 지우기 링크를 클릭하면 아래에 첨부 된 결과가 지워집니다.

가 Selectize에서 제공하는 clearoptions() 이벤트를 사용하려면, 내가 업데이트 한 내 create: 내 자바 스크립트 코드 :

create: function(input, callback) { 

    $.ajax({ 
     url: base_url + '/search-property-autocomplete', 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      q: query, 

     }, 
     error: function() { 
      callback(); 
     }, 
     success: function(res) { 

      return callback({ address: "<a href='javascript:void(0)'>Clear All</a>" }); 

     } 
    }); 


}, 

그러나 나는 거기에 내 추가 된 옵션을 볼 수 없습니다 나는대로 작동하지 않는 것 같습니다. 내 결과가 채워진 후 내 하이퍼 링크를 볼 수 없습니다.

나는 이미 검색 한 다음 채워진 레코드를 아래 코드와 같이 사용한다는 것을 알고 있습니다.

$('.my-hyperlink-custom-class').on('click', function() { 
    control.clearOptions(); 
}); 
그러나이 새로운 항목을 코드에 삽입하거나 Ajax를 사용하여 채운 결과로 밀어 넣었습니다.

누군가가 나를 어떻게 안내 할 수 있습니까?

답변

1

모두에게 도움과 지원을 해주셔서 감사합니다. 이 기능을 구현하는 데 도움이되는 @afeique의 특별한 감사의 말을 전합니다.

내가 결국 생각해 낸 해결책은 다음과 같습니다.

$('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: true,  
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 
     $(".selectize-input input[placeholder]").attr("style", "width: 100%;"); 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 

     // Appending only if not exists 
     if($('.clearAllSuggestions').length == 0) { 
      $(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>'); 
     } 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       console.log(res.properties); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 


$('body').on('click', '.clearAllSuggestions', function() { 

    var $select = $('#q').selectize({}); 
    var control = $select[0].selectize; 
    control.clearCache('option'); 
    control.clearOptions(); 
    control.refreshOptions(true); 
}); 

나는 조금 내 코드를 수정하고 내 제안 태그 옵션에서 "모두 지우기"앵커 태그를 추가 내 load 이벤트에 코드를 아래에 넣어.

// Appending only if not exists 
     if($('.clearAllSuggestions').length == 0) { 
      $(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>'); 
     } 

그럼 간단히 캐시와 옵션을 지우려고 했으므로 아래 코드를 넣었습니다.

$('body').on('click', '.clearAllSuggestions', function() { 

    var $select = $('#q').selectize({}); 
    var control = $select[0].selectize; 
    control.clearCache('option'); 
    control.clearOptions(); 
    control.refreshOptions(true); 
}); 

희망이 있습니다.

4

여기에 제가 작성한 스크립트가 있습니다. 이렇게하면 으로 선택된 것 위에있는 모든 href 속성이 변경되지만 아래의 속성은 동일하게 유지됩니다. 필요에 따라 수정할 수 있습니다. 이 예에서

$('#input-tags3').selectize({ 
    plugins: ['remove_button'], 
    delimiter: ',', 
    persist: false, 
    create: function(input) { 
     return { 
      value: input, 
      text: input 
     } 
    } 
}); 

:

$(".row").click(function(){ 
 
var present = $(this).index(); 
 
console.log("present"+present) 
 
$(this).closest('.container').find('.row').each(function(index,element){ 
 
    console.log("eachindex"+$(this).index()); 
 
    \t if($(this).index()>=present) { 
 
    \t 
 
    } 
 
    else { 
 
    \t $(this).attr("href","javascript:;"); 
 
    } 
 
}) 
 
$(".row").each(function(){ 
 
    \t $("#finalAttribute").append($(this).attr("href")); 
 
}) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="container"> 
 
    <a class="row row1" href="#1"> 
 
    R1 
 
    </a> 
 
    <br/> 
 
    <a class="row row2" href="#2"> 
 
    R1 
 
    </a> 
 
    <br/> 
 
    <a class="row row3" href="#3"> 
 
    R2 
 
    </a> 
 
    <br/> 
 
    <a class="row row4" href="#4"> 
 
    R3 
 
    </a> 
 
    <br/> 
 
      <a class="row row5" href="#5"> 
 
    R4 
 
    </a> 
 
    <br/> 
 
</div> 
 
<div id="finalAttribute"> 
 

 

 
</div>

3

용서, 나는 Selectize 경험이 없지만 나는 그들의 examples를 스캔하고 도움이 될 수있는 무언가를 발견 않았다 create:에는 함수 프로토 타입 function(input)이 하나의 인수 만 있고 콜백 함수는 없습니다. 귀하의 코드는 다음 프로토 타입을 사용하고 있습니다 : create: function(input, callback). 예제 선택에서 load:function(input, callback)으로 만 사용했습니다.

create: function(input) { 
    // append "clear all" anchor to top of search div 
    $("#searchDiv").append('<a href="#" class="clearAll">Clear All</a>') 

    // perform autocomplete AJAX 
    $.ajax({ 
     url: base_url + '/search-property-autocomplete', 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      q: query, 

     }, 
     error: function() { 
      // add text 
      return input; 
     }, 
     success: function(res) { 
      // TODO: do something to display the autocomplete results 
      // e.g. create a dropdown with autcomplete suggestions 
      // TODO: handle user selecting one of the suggestions 

      // add text 
      return input; 
     } 
    }); 


}, 

을 당신이 원하는 기능을 얻기 위해 필요한 TODO들 작성 :

나는의 라인을 따라 뭔가에 create:을 변경 제안합니다.

HTH 당신이 달성하려고하는 무엇

+1

귀하의 답변은 어떻게 든 제가 원하는 것을 해결하거나 구현하는 데 도움이되었습니다. 그러므로 나는 현상금 보상을주는 당신의 대답을 선택하고 있습니다. 그러나 누군가가 내가했던 곳에 똑같은 문제가 붙어있는 경우 최종 답변으로 답변을 제공했습니다. 고맙습니다. –

+1

[Here] (https://stackoverflow.com/a/46398821/6829420)는 내가 생각해 낸 것입니다. –

3

는 약간 다르게 수행 할 수 있습니다. 콜백을 사용하면 추가 ... 옵션을 맨 위에 표시하면 초기 옵션 목록에없는 새 항목이 만들어집니다. 이것은 당신이 원하는 것이 아닙니다.

그냥 시도 :

var $select = $('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: false, 
    score: function() { return function() { return 1; }; }, 
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 

     if(value == 'Clear All') { 
      var control = $select[0].selectize; 
      control.clearOptions(); 
     } 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       // add the clear All option on top. 
       res.properties.unshift({address: "Clear All" }); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 

이 추가 옵션을 추가하고 선택하면 옵션을 취소 OnChange 이벤트를 사용합니다.

또한 점수 옵션에 유의하십시오. 그러면 기본 필터링이 비활성화됩니다.

4

이 방법을 시도해 볼 수 있습니까? DOM 렌더링 및 JS 함수 바인딩 문제가 있다고 생각합니다. 요소가로드 할 때 사용할 수 없으므로 요소는 javascript로 바인딩 할 수 없습니다. below 메소드가 작동합니다.

$('body').on('click', '.my-hyperlink-custom-class', function() { 
    control.clearOptions(); 
}); 

여기에 필자는 body에 함수를 바인딩했지만 대상 요소가 .my-hyperlink-custom-class인지 다시 확인했습니다.