2013-02-12 1 views
67

В функции ссылок есть ли более «Угловой» способ привязки функции к событию клика?Использование ng-click vs bind в функции ссылки Angular Directive

Прямо сейчас, я делаю ...

myApp.directive('clickme', function() { 
    return function(scope, element, attrs) { 
    scope.clickingCallback = function() {alert('clicked!')}; 
    element.bind('click', scope.clickingCallback); 
} }); 

Это Угловая способ сделать это, или это некрасиво хак? Возможно, я не должен быть так обеспокоен, но я новичок в этой структуре и хотел бы знать «правильный» способ делать что-то, тем более, что рамки продвигаются вперед.

+2

Оба подходят, вы можете идти вперед и делать все, что вы сочтете нужным. Единственное отличие в вашем примере состоит в том, что 'bind' запускает цикл' digest'; что может быть и то, что вы, возможно, захотите, но будьте в курсе. –

+2

Умур, вы имели в виду сказать, что 'bind' не запускает цикл дайджеста? – demisx

+0

Я использую это, когда мне нужно избегать дорогостоящего цикла дайджеста, например большого набора данных, требующего действия пользователя. С той лишь разницей, что я использую его в ссылке: function(). – Fred

ответ

61

Вы можете использовать контроллер в директиве:

angular.module('app', []) 
    .directive('appClick', function(){ 
    return { 
     restrict: 'A', 
     scope: true, 
     template: '<button ng-click="click()">Click me</button> Clicked {{clicked}} times', 
     controller: function($scope, $element){ 
     $scope.clicked = 0; 
     $scope.click = function(){ 
      $scope.clicked++ 
     } 
     } 
    } 
    }); 

Demo on plunkr

Подробнее о директивах в Angular guide. И очень полезно для меня было видео с официального сообщения Angular blog About those directives.

+0

Спасибо за указатель на сообщение в блоге! – ehfeng

+0

Я действительно хочу добавить атрибут ng-click к самому элементу, а не к элементу шаблона (в вашем случае, к кнопке). Вы знаете, как это сделать? – ehfeng

+1

Ничего, я это понял - я могу использовать опцию «replace» в директиве. – ehfeng

36

Я думаю, это прекрасно, потому что я видел, как многие люди так поступают.

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

myApp.directive('clickme', function() { 
    return function(scope, element, attrs) { 
    var clickingCallback = function() { 
     alert('clicked!') 
    }; 
    element.bind('click', clickingCallback); 
    } 
}); 
+14

В clickCallback, если вы меняете данные модели/области, вам нужно вызвать область действия. $ Apply() или поместить содержимое метода в область видимости. $ Apply (function() {... contents here. ..}); –

10

Не должно быть просто:

<button ng-click="clickingCallback()">Click me<button> 

Почему вы хотите, чтобы написать новую директиву просто сопоставить события нажатия на обратный вызов на Вашей области? ng-click уже делает это для вас.

+8

Мне тоже любопытно, что на этом написано. 'ng-click' versus' element.bind() ' – jvannistelrooy

+6

Возможно, просто чтобы сделать эту часть повторно используемой, повторите код в другом месте. – Estevez

+0

@Estevez это точно мой прецедент. – Alisson

-4
myApp.directive("clickme",function(){ 
    return function(scope,element,attrs){ 
     element.bind("mousedown",function(){ 
      <<call the Controller function>> 
       scope.loadEditfrm(attrs.edtbtn); 
     }); 
    }; 
}); 

это будет действовать как OnClick события на атрибуте ClickMe

0

Вы должны использовать контроллер в директиве и нг щелкните в шаблоне HTML, как предложено предыдущие ответы. Однако, если вам нужно выполнить манипуляции с DOM при событии (щелчок), например, щелкнув по кнопке, вы хотите изменить цвет кнопки или так, затем используйте функцию Link и используйте элемент для управления dom.

Если все, что вы хотите сделать, это какое-то значение для элемента HTML или любой такой манипулятивной задачи, не требующей вмешательства, тогда вам может не понадобиться директива и вы можете напрямую использовать контроллер.