2015-02-17 5 views
2

Я обертываю плагин jQuery внутри директивы AngularJS. То, как я хотел бы назвать директиву, например,:Динамический идентификатор внутри шаблона AngularJS

<my-dialog data-trigger-id="myTriggerId">My dialog content...</my-dialog> 

Внутри моего шаблона директивы выглядит следующим образом:

<button id="{{triggerId}}">Button text...</button> 

Я придаю событие для плагина Jquery (где вы указываете триггер селектор) внутри функции ссылки моей директивы. Моя проблема заключается в том, что это работает, если я жёстко идентификатор кнопки внутри шаблона директивы, как это:

<button id="myTriggerId">Button text...</button> 

Сгенерированного HTML выглядит отлично в браузере, это означает, что делает элемент с динамическими работами ид. Это просто, что плагин jQuery не может найти этот элемент, если я использую динамический идентификатор, но он работает с жестко кодированной версией. Я также искал компиляцию AngularJS, потому что это похоже на то, что плагин jQuery хочет инициализировать элемент еще не существует.

Есть ли у меня пропадание? Благодаря!

Редактировать: мне, наконец, удалось упростить его и создать пример jsfiddle. Если вы запустите этот пример, вы увидите в консоли, что этот элемент не существует в то время, когда я его регистрирую, но если вы проверите DOM, вы увидите, что он есть и имеет правильный идентификатор. Однако, если вы жестко зададите идентификатор в шаблоне (id = test вместо id = {{elemId}}), в консольном журнале будет показано, что один элемент может быть найден. Надеюсь, это поможет найти решение.

http://jsfiddle.net/a1nxyv8u/7/

+0

Можете ли вы создать jsfiddle или предоставить код для своей директивы, чтобы мы увидели, что вы делаете. – thedoctor

+0

Спасибо за ваш комментарий. Его, к сожалению, не с открытым исходным кодом, но я попытаюсь создать аналогичный пример. – Bay

+0

Есть ли конкретная причина, по которой вы хотите использовать уникальный идентификатор вместо использования $ (element) .length? – Scottie

ответ

3

дайджеста еще не вынесено в DOM к тому времени, вы звоните вам $ («# тест»). Длина.

Вам нужно добавить в $ тайм-аут, так что гидролизат будет завершена, а затем вызвать ваш метод

var app = angular.module('app', []); 
app.directive('myDialog', ['$timeout', function ($timeout) { 
    return { 
     restrict: 'E', 
     template: '<button id="{{elemId}}" class="{{elemClass}}">Open dialog</button>', 
     link: function (scope, element, attrs) { 

      var selector = scope.elemSelector, 
      elemClass = (selector.indexOf('.') > -1) ? selector.substr(1) : '', 
      elemId = (selector.indexOf('#') > -1) ? selector.substr(1) : ''; 

      scope.elemClass = elemClass; 
      scope.elemId = elemId; 

      $timeout(function() { 
       console.log('elem: ', $('#test').length); 
      }); 
      // jQuery plugin init here but element doesn't seem to exist yet. 

     }, 
     scope: { 
      elemSelector: '@' 
     } 
    } 
}]); 

Хотя следует отметить, что вы должны попробовать и облегчить ИН на всех и просто использовать $ (элемент), если только ваш jQuery не нуждается в Id.

+1

Большое спасибо за ваш ответ и решение. Я больше не работал над своим кодом, но пытаюсь понять, что происходит под капотом AngularJS. Причина, по которой мне нужен идентификатор вместо элемента, заключается в том, что плагин является наложением, для которого требуется элемент триггера. Я помещал этот триггерный элемент в шаблон директивы. Чтобы иметь возможность использовать несколько этих директив внутри страницы, я бы предоставил уникальные идентификаторы. Тем не менее, я также понял, обсуждая эту проблему с коллегой, что на самом деле это не Угловой способ обернуть плагины jQuery внутри директив. Я думаю, что Angular директивы должны быть KISS. – Bay

+1

Обтекание плагина jQuery внутри угловых директив абсолютно приемлемо ... если не имеется углового эквивалента плагина, который, по-видимому, разрежен. Однако я мог бы предложить создать уникальный идентификатор внутри вашей директивы вместо того, чтобы пользователь прошел один. Вы можете сделать что-то вроде id = 'myDirective_ $ id', а затем в своих вызовах jQuery вы можете просто сделать $ ("# myDirecitve_" + $ scope. $ id). – Scottie

+0

Спасибо, это хорошая идея, которая сделает еще проще для другого разработчика в проекте использовать эту директиву. Очевидно, я могу и попытаюсь это сделать, но будет ли это работать без метода $ timeout? – Bay

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