2016-09-19 4 views
0

Я использую Angular 1.4.7. Я не создал этот сайт, поэтому я не уверен, какую информацию мне нужно дать для этого. Мы рендеринг некоторых поисковые фильтров, но будет ли или не вы, они позволили конфигурируются данными, полученных с сервера, например:Угловой - запуск jQuery после обновления данных

$scope.searchFields = { 
    "date": true, 
    "price": true, 
    ... 
}; 

HTML-код для поля поиска ($scope.filter является индивидуальным набором для Варса этот конкретный фильтр, в данном случае это просто выбрав максимальное числовое значение):

<div class="limit-group clearfix"> 
    <span class="detail">Filter Name:</span> 
    <div class="filter-select-small"> 
     <select name="filter" class="custom-select" ng-if="searchFilters.code"> 
      <option value="">No Max</option> 
      <option ng-repeat="(key, value) in filter" value="<%key%>"><%value%></option> 
     </select> 
     <span class="unavailable" ng-if="!searchFilters.code">Unavailable</span> 
    </div> 
</div> 

есть условия, где доступные поля поиска будет меняться. Поля выбора по какой-либо причине заменяются плагином jQuery под названием selectbox. У меня есть функция resetFilterStyles(), которая присоединяет плагин jQuery к полям, но я не уверен, где его запускать.

Внутри методов, определенных на $scope данных обновляются с помощью $http.get() но работает resetFilterStyles() внутри эти анонимные функции не работает, по-видимому, потому что Угловая еще не обработаны, что данные были обновлены, поэтому изменения, которые были бы выполненные resetFilterStyles(), отменяются обновлениями Angular в DOM.

Я пробовал установить обработчик $watch, но это кажется неправильным местом для запуска моей функции, поскольку она, по-видимому, не принимает, (и дополнительно вызывает тяжелые ошибки в пределах Углового). Как человек, который не использует Angular, я не уверен, куда идти отсюда.

Редактировать

Функция сброса:

function resetFilterStyles() { 
    // desktop adv filters 
    var filterContainer = $('.advance-filter-dropdown'); 
    $('select',filterContainer).selectbox('detach'); 
    $('select',filterContainer).selectbox('attach'); 
    $(".filter-select-small .sbOptions").niceScroll({cursorborder:"",cursorcolor:"#ccc",autohidemode: false}); 

    // mobile adv filters 
    var filterContainer = $('.filter-wizard-mobile'); 
    $('select',filterContainer).selectbox('detach'); 
    $('select',filterContainer).selectbox('attach'); 
    $(".filter-select-small .sbOptions").niceScroll({cursorborder:"",cursorcolor:"#ccc",autohidemode: false}); 
} 
+0

Любой шанс вы можете загрузить остальную часть кода, предпочтительно plunker? – dwbartz

+0

Это много, и я не думаю, что у меня есть разрешение на публикацию неотредактированного кода (что должно было бы поддерживать мое рассудочное отношение). Есть что-то более ожидаемое? –

+0

Мне просто интересно посмотреть ваш контроллер и функцию сброса, которую вы упомянули. Поскольку они не видят изменений, они не будут отображаться до тех пор, пока Angular не выполнит цикл дайджеста, который, если вы не укажете, что он явно запускается, он не знает, как работать. – dwbartz

ответ

2

С точки зрения AngularJS, вы не должны делать изменения DOM внутри контроллера. Вы должны создать директиву/компоненту для обработки этого для вас.

Но если вы действительно должны иметь, что Jquery (устаревшие проекты, например), вы можете поставить модификацию DOM в $ таймаут:

$http.get("url").then(function() { 
     $timeout(function() { 
      // updateDom 
     }, 0); 
}); 
+0

Я с точки зрения AngularJS _shouldn't не использовался в первую очередь_ (и то же самое с jQuery), поэтому я занимаюсь тем, что у меня есть. Я не уверен, что я правильно читаю документы о директивах/компонентах, но они выглядят так, как будто они не совместимы ни с одной из соответствующих спецификаций HTML (тогда снова он уже использует 'ng-', который несовместим, либо). –

+1

Как я и подозревал :) Пожалуйста, проверьте данное решение и сообщите мне, если это сработает. –

+0

Это работает, но я не уверен, что это «правильно» в данной настройке и не заходит так далеко, чтобы начать использовать [более] недопустимую разметку. –

Смежные вопросы