2013-10-09 6 views
7

Мне очень нравится, как новая директива ng-click в Angular теперь автоматически включает функции для сенсорных событий. Тем не менее, мне интересно, можно ли получить доступ к этой службе touch-event из моей пользовательской директивы? У меня есть множество директив, которые требуют, чтобы я привязывал событие click к данному элементу, но я просто делаю это с использованием типичного синтаксиса jquery (например: element.on('click', function(){ ... })). Есть ли способ связать событие ng-click с элементом внутри директивы? Без необходимости вручную поставить тег ng-click на мой элемент в HTML моего представления ...?AngularJS: доступ к службе ngTouch из директивы?

Я хочу, чтобы иметь возможность использовать мощность обоих щелчков и события касания. Я мог бы явно импортировать библиотеку (например, HammerJS или QuoJS), но я бы предпочел не делать этого, тем более, что Angular уже делает это.

Я могу получить доступ к сервису $swipe и связать с ним различные элементы, но существует ли аналогичная услуга для ngTouch?

Для справки, это пример того, когда я хотел бы сделать это:

mod.directive('datepicker', ['$timeout', function($timeout){ 
    return { 
     link: function(scope, elem, attrs){ 
      var picker = new DatePicker(); 

      elem.on('click', function(e){ 
       picker.show(); 
      }); 

      // I would rather do something like: 
      // elem.on('ngTouch', function(){ ... }); 
      // 
      // or even: 
      // $ngTouch.bind(elem, {'click': ..., 'touch': ...}); 
     } 
    } 
}]); 

UPDATE: Как отмечено ниже, исходный код ng-click директивы here. Может ли кто-нибудь увидеть способ использовать этот код и превратить его в «связующую» службу?

+0

вы имеете в виду что-то вроде этого: http://stackoverflow.com/questions/15279244/dynamically -add-directives-on-angularjs – akonsu

+0

смысл, просто обертывание элемента 'elem' в другом элементе с атрибутом' ng-click'? или добавление атрибута 'ng-click' в элемент' elem'? Я предполагаю, что это сработает ... но это похоже на «хак-иш» (особенно с вопросами «компиляции», упомянутыми в этом сообщении) ... идеи? – tennisgent

+0

Насколько я понимаю, модуль 'ngTouch' реализует замену директивы' ngClick' (см. Https://github.com/angular/angular.js/blob/master/src/ngTouch/directive/ngClick.js) , попробуйте ввести «ngClickDirective» и сделайте то, что предлагает этот пост: https://groups.google.com/d/msg/angular/xBFABCLv4XI/maoKgWubzQ0J – akonsu

ответ

8

Я не думаю, что это правильный подход. Я бы подошел к этому, используя шаблон в вашей директиве, а затем используя ngTouch.

mod.directive('datepicker', ['$timeout', function ($timeout) { 
    return { 
     template: '<div ng-touch="doSomethingUseful()"></div>', 

     link: function (scope, elem, attrs) { 
      var picker = new DatePicker(); 

      scope.doSomethingUseful = function() { 
       // Your code. 
      } 
     } 
    } 
}]); 

UPDATE

Полный пример с дополнительными атрибутами по директиве элемента:

http://codepen.io/ed_conolly/pen/qJDcr

+0

Мне нравится этот подход, но проблема в том, что у меня есть ряд других атрибутов в моем директивном элементе в DOM. Он выглядит так: '

'. Поэтому я предпочел бы не использовать шаблон, потому что тогда он заменит элемент, который я написал в DOM ... любые идеи, как обойти это? – tennisgent

+0

Это для вашей директивы в любом случае, поэтому, вероятно, нужно пройти через область видимости: {}? – eddiec

+0

Пример здесь http://codepen.io/ed_conolly/pen/qJDcr В примере показано наличие других атрибутов в DOM и их включение в директиву. Похоже, это тот подход, который вы хотите. – eddiec

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