【问题标题】:AngularJS: accessing the ngTouch service from a directive?AngularJS:从指令访问 ngTouch 服务?
【发布时间】:2013-10-17 03:43:58
【问题描述】:

我真的很喜欢 Angular 中的新 ng-click 指令现在自动包含触摸事件的功能。但是,我想知道是否可以从我的自定义指令访问该触摸事件服务?我有很多指令要求我将单击事件绑定到给定元素,但我只是使用典型的 jquery 语法(例如:element.on('click', function(){ ... }))来执行此操作。有没有办法可以将ng-click 事件绑定到指令中的元素?无需在视图的 HTML 中手动将ng-click 标记放在我的元素上...?

我希望能够利用点击触摸事件的力量。我显然可以导入一个库(例如 HammerJSQuoJS),但我不想这样做,特别是因为 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': ...});
         }
     }
}]);

更新:如下所述,ng-click 指令的源代码是here。谁能找到一种利用该代码并将其转变为“可绑定”服务的方法?

【问题讨论】:

  • 你的意思是这样的吗:stackoverflow.com/questions/15279244/…
  • 意思是,只是将elem 元素包装在另一个具有ng-click 属性的元素中?或将ng-click 属性添加到elem 元素?我想这些会起作用......但它似乎有点“hack-ish”(尤其是在那篇帖子中提到的$compile问题)......想法?
  • 据我了解,ngTouch 模块实现了对ngClick 指令的替换(参见github.com/angular/angular.js/blob/master/src/ngTouch/directive/…),尝试注入ngClickDirective 并按照这篇文章的建议进行操作:groups.google.com/d/msg/angular/xBFABCLv4XI/maoKgWubzQ0J
  • 好的,我喜欢这个主意。所以我将'ngClickDirective' 导入到我的自定义指令中,这给了我一个ngClickDirective 变量,但是我该怎么处理它呢?我刚试过,所有ngClickDirective 对象都是:[{"priority":0,"name":"ngClick","restrict":"A"}]...?

标签: angularjs


【解决方案1】:

我认为这不是完全正确的方法。我会通过在您的指令中使用模板然后在其中使用 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.
             }
         }
     }
}]);

更新

在指令元素上有附加属性的完整示例:

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

【讨论】:

  • 我喜欢这种方法,但问题是我在 DOM 中的指令元素上有许多其他属性。它看起来像这样:&lt;div datepicker start-date="someDateVar1" end-date="someDateVar2" default-date="someDateVar3"&gt;&lt;/div&gt;。所以我宁愿不使用模板,因为那样它会替换我在 DOM 中编写的元素......有什么想法可以解决这个问题吗?
  • 无论如何,那是你的指令,所以可能应该通过范围传递:{}?
  • 此处为示例codepen.io/ed_conolly/pen/qJDcr 该示例显示在 DOM 上具有其他属性并将它们拉入指令。听起来这就是您想要的方法。
  • 完全有道理!在我的 Angular 日子里,我大概写了 50 个指令,但从来不知道你可以使用 scope: {} 语法将指令属性绑定到范围。我认为这只是为了绑定到控制器范围属性。但是在查看了您的示例并查看了文档之后,这显然是它的意图。谢谢您的帮助!值得 50 分来学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2017-08-15
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多