在Angular Directive的链接函数中使用ng-click vs bind


67

在链接函数中,是否存在将函数绑定到click事件的更多“角度”方式?

现在,我在做...

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

这是Angular的方式还是丑陋的破解?也许我不应该这么担心,但是我是这个框架的新手,并且想知道“正确”的做事方式,尤其是随着框架的发展。


2
两者都适合做,您可以继续做您认为合适的事情。您的示例的唯一区别是bind确实开始了一个digest循环。这可能也是您可能想要的,但请注意。
UmurKontacı2014年

2
乌穆尔,您的意思是说这bind不会开始消化周期吗?
Demisx 2014年

当我需要避免昂贵的摘要周期(例如需要用户操作的大型数据集)时,可以使用此方法。唯一的区别是我在链接中使用了它:function()。
2015年

Answers:


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++
         }
       }
     }
   });

在plunkr上的演示

Angular guide中有关指令的更多信息。对我来说非常有用的是Angular官方博客文章中关于这些指令的视频


我实际上想将ng-click属性添加到元素本身,而不是模板元素(在您的情况下为按钮)。你知道怎么做吗?
ehfeng

1
没关系,我已经弄清楚了-我可以在指令中使用“替换”选项。
ehfeng

1
@Maxim Grach为什么不将按钮HTML放到HTML中呢?显示一个调用控制器方法的按钮似乎需要很多工作,并且在查看HTML时不太明显。PS我也正在学习有角度的。
turbo2oh

1
@ turbo2oh这个例子非常简单,脱离了现实生活。但是它显示了如何使用角度指令。
Maxim Grach 2013年

1
@MaximGrach使用范围:{}将隔离范围,而使用true则允许共享范围。
2015年

36

我认为这很好,因为我已经看到很多人这样做。

如果仅在指令中定义事件处理程序,则不必在作用域上定义它。跟随会很好。

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

14
在clickCallback中,如果要更改任何模型/作用域数据,则需要调用scope。$ apply(),或将方法的内容放入scope。$ apply(function(){... contents .. 。});
Mark Rajcok

10

它不应该仅仅是:

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

为什么要编写一个新指令,只是将click事件映射到作用域上的回调?ng-click已经为您做到了。


8
我也对这一观点感到好奇。ng-click对抗element.bind()
JacobF 2014年

6
也许只是为了使该部分重新定义,而在其他地方重复该代码。
Estevez 2015年

@Estevez正是我的用例。
阿里森(Alisson)'17年

0

您应该在指令中使用控制器,并在模板html中ng-click,如先前建议的那样。但是,如果需要在事件(单击)上执行DOM操作,例如单击按钮时,则要更改按钮的颜色等,然后​​使用Link函数并使用元素来控制dom。

如果您要做的只是在HTML元素或任何此类非dom操纵任务上显示一些值,则您可能不需要指令,可以直接使用控制器。



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

这将充当属性clickme的onclick事件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.