Ответ 1
также убедитесь, что вы не указали свою директиву в index.html
TWICE!
В моем приложении angular директивы работают нормально во время первого посещения, но после того, как страница была посещена дважды, вся функция директивной ссылки вызывается дважды. Скажем, я на странице A, щелкните ссылку, чтобы перейти на страницу B, а затем вернуться на страницу A, все директивы на странице A будут выполнять свою функцию связи дважды. если я обновляю браузер, он снова станет нормальным.
Вот пример, когда console.log будет выводить дважды при втором посещении.
@app.directive 'testChart', ["SalesOrder", (SalesOrder) ->
return {
scope: {options: '='}
link: (scope, elem, attrs) ->
console.log("............checking")
SalesOrder.chart_data (data) ->
Morris.Line
element: "dash-sales"
data: data
xkey: 'purchased_at'
ykeys: ['total']
labels: ['Series a']
}
]
Любая идея?
Update
Мой маршрут
когда ( "/dash", { templateUrl: "<% = asset_path ('app/views/pages/dash.html')% > ", контроллер: DashCtrl }).
поэтому моя диаграмма дублируется
также убедитесь, что вы не указали свою директиву в index.html
TWICE!
Функция link() вызывается каждый раз, когда элемент должен привязываться к данным в объекте $scope.
Пожалуйста, проверьте, сколько раз вы извлекаете данные, используя GET-вызов. Вы можете отслеживать извлечение ресурсов через вкладку "Сеть", отладчика хрома.
Директива настраивает элемент HTML, а затем обновляет этот HTML-код каждый раз, когда изменяется объект области $.
Лучшее имя для функции link() было бы чем-то вроде bind() или render(), который сигнализирует, что эта функция вызывается всякий раз, когда директиве необходимо привязать данные к ней или повторно отобразить ее.
У меня была такая же проблема. После loooooong времени копания вокруг я обнаружил, что я не использовал правильный закрывающий тег, в результате чего график вызывается дважды.
У меня был
<line-chart><line-chart>
вместо
<line-chart></line-chart>
Может быть, это поможет кому-то...
У меня была проблема с директивой transclude, я использовал функцию transclude, которая добавляла дочерние элементы, и в то же время я забыл ng-transclude
в шаблоне директивы. Детскими элементами также были директивы, и их функция link
вызывалась дважды!
Прошло некоторое время на этом.
Подробнее:
У меня были директивы "main" и "child", идея заключалась в том, чтобы использовать один внутри другого, что-то вроде этого:
main
child
child
Таким образом, проблема заключалась в том, что link
директивы "child" вызывается дважды, и я не понимал, почему,
Оказалось, что у меня есть ng-transclude
в шаблоне директивы main (я отправляю его, как и в формате PUG, извините за это):
md-card(layout-fill)
md-card-content(flex)
.map-base(id="{{::config.id}}", layout-fill)
ng-transclude
а также в функции link
из "основной" директивы, которую я называл функцией пересылки:
link: function($scope, $element, $attrs, controller, transcludeFn) {
$element.append(transcludeFn());
}
Я думаю, что я просто пробовал разные комбинации и забыл об этом, наглядно все было в порядке, но link
вызывался дважды, а код запускался дважды, а логика была сломана.
Таким образом, проблема заключается в том, что вы не можете иметь обоих, и вам нужно выбрать один из способов.
Надеюсь, теперь это станет более ясным.
В моем случае у меня был главный навигатор и суб-навигатор, который назывался директивой по его атрибуту name. Поскольку первый экземпляр уже задал необходимый объем, второму второму второму вызову не понадобилось. У кого-то есть аналогичная проблема.