使用 .on 绑定点击是否受益于 ngTouch
Does using .on to bind click benefit from ngTouch?
目前我们的项目没有ngTouch,但将来会。我们仍在学习 Angular。
我有这个简单的指令
app.directive('myDir', ['$log', function($log) {
return {
restrict: "A",
link: function($scope, iElm, iAttrs, controller) {
iElm.on('click', function($event) {
// functionality...
});
}
};
}]);
我正在绑定单击此处而不是使用ng-click
因为我不希望显示 html 标记。
当我们包含这种类型的绑定时,它是否会利用ng-touch
?我的意思是,如果您使用包含ng-touch
的ng-click
,那么单击/点击后将不再有 300 毫秒的延迟。因此,如果我不使用ng-click
而只是使用.on
它仍然会正常工作吗?
不,touchstart
与 click
是不同的事件。您需要执行以下操作:
element.on('click touchstart', function (event) {
/* ... */
});
上述内容将同时为两个事件注册一个处理程序。另请记住,由于此事件处理程序是在 Angular 摘要周期之外触发的,因此您需要将其内容包装在 $scope.$apply
中。
app.directive('myDir', function ($log) {
return {
restrict: 'A',
link: function ($scope, element, attrs) {
element.on('click touchstart', function (event) {
$scope.$apply(function () {
// functionality...
});
});
}
};
});
编辑:回复:角摘要循环。
当您在角度控制器或角度指令内部执行操作时,所有这些逻辑都在角度摘要循环内运行。摘要循环基本上是 angular 的事件循环。只要角度是启动逻辑路径的那个,那么角度就能够确保事情以正确的顺序发生。当事情按预期在摘要周期中发生时,角度能够适当地更新 UI,一切都很好。
当您执行诸如从角度指令或控制器内部注册事件处理程序之类的操作时,了解这一点很重要。如果事件是由未包装在角度魔法中的东西触发的(就像大多数在幕后为您注册 DOM 事件处理程序的本机指令一样),则该逻辑路径发生在角度摘要周期之外。您可能会看到的副作用是,即使代码运行并按预期修改范围数据,UI 也不会更新。下次该范围变量在摘要周期中突然更改时,您将看到所做的更改。
若要解决此问题,需要手动注册要使用 angular 执行的逻辑,以便它可以在摘要周期中的适当时间执行该逻辑,并按预期更新 UI。为此,您只需将要执行的逻辑包装在$scope.$apply
中,只需进行简单的回调。然后,它手动开始摘要循环,并调用您在该周期中提供的回调。
如果你很好奇,这就是ng-click
指令所做的一切:
app.directive('ngClick', function ($parse) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var fn = $parse(attrs.ngClick, null, true);
element.on('click', function (event) {
scope.$apply(function () {
fn(scope, { $event: event });
});
});
}
};
});
它使用内置的 $parse
实用程序来解析您提供给ng-click
的表达式并执行它。它将局部scope
传递给表达式,以便您可以在表达式内使用范围内的变量。这就是为什么你可以做 ng-click="myFunction(someScopeVar)"
.它还传入一个名为$event
仅在该表达式中可用的自定义变量。请注意,它只是字面上包装的 JQuery DOM 事件。另请注意,Angular 将 DOM 事件逻辑包装在对$scope.$apply
的调用中,以便它在摘要循环中适当地发生。
- 访问布局信息是否也会导致浏览器重排
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何检测是否有溢出
- jQuery中是否内置了任何字符串格式化函数
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 测试索引值是否等于某个数字的倍数
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 是否可以禁用jquery中的单个单选按钮
- 是否可以从父类访问子类的属性
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 如何让程序检查所选单词中是否有按键
- 用于检查数组中是否存在元素的javascript自定义方法
- 如何使用jquery确定用户是否年满18岁
- 使用 .on 绑定点击是否受益于 ngTouch