AngularJS клонированный элемент в директиве (без контроллера) дважды вызывает функцию из контроллера

#angularjs #directive

#angularjs #директива

Вопрос:

Я написал директиву, чтобы исправить заголовок таблицы сверху при прокрутке. Все работает нормально. Таблица также сортируется. Когда пользователь нажимает на заголовок столбца, список сортируется по этому столбцу, а когда пользователь нажимает на активный столбец, сортировка меняется на противоположную. Все работает так, как я ожидал. Но когда я нажимаю на фиксированный заголовок, функция сортировки вызывается дважды (вы можете увидеть это в консоли).

Я не могу найти источник проблемы и способы ее решения. Вот мой plunkr. Заранее спасибо за любую помощь…

Кстати, если я удалю коды компиляции (

 var linkFn = $compile(fixedHeader);
linkFn(scope);
  

), он работает нормально. Но тогда ng-class не применяется, потому что я думаю, что он не может получить доступ к переменным контроллера.

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

Я обновил plunkr, чтобы показать мою проблему с ng-классом при удалении кодов компиляции.

Ответ №1:

ваша проблема в том, что когда вы делаете это

  fixedHeader = header.clone(true).addClass("header-fixed").width(header.width());
  

а затем выполняет

   var linkFn = $compile(fixedHeader);
  linkFn(scope);
  

вы копируете не только html, но и привязки, поэтому вам не нужно его компилировать и снова связывать, но поскольку вы это делаете, ваши события выполняются дважды, потому что они связаны дважды. итак, вы можете продолжить и удалить $compile или назначить header.html () содержимое вашего фиксированного заголовка и скомпилируйте его.

Комментарии:

1. Большое спасибо. Я узнал это, но, к сожалению, это не решение. Проверьте мое редактирование…

2. что я должен здесь увидеть? для меня выглядит одинаково с компиляцией и без нее

3. ng-class не применяется к fixedHeader без компиляции.

Ответ №2:

Попробуйте angular.copy():

  fixedHeader = angular.copy(header).addClass("header-fixed").width(header.width());