在这种情况下,在 AngularJS 中处理事件的最佳方法是啥?

Posted

技术标签:

【中文标题】在这种情况下,在 AngularJS 中处理事件的最佳方法是啥?【英文标题】:What is the best way to handle events in AngularJS in this case?在这种情况下,在 AngularJS 中处理事件的最佳方法是什么? 【发布时间】:2016-02-15 07:03:27 【问题描述】:

我是 AngularJS 的新手,我对如何在 Angular 中处理事件有以下疑问。

所以我知道在视图中我是否有这样的东西:

<input type="text" ng-model="handle" />

这意味着在 dom 中的这个输入元素和 Angular $scope 中的 handle 变量之间存在 2 路绑定,例如:

$scope.handle = '';

因此,此输入对象发生的任何更改都意味着 $scope 中的句柄属性的更改,反之亦然。

所以,在 Angular 应用程序中,我可以显式声明一个 whatcher

// I explicitly declare a whatcher on the handle property: when the value of this propertu change the function() is performed:
$scope.$watch('handle', function(newValue, oldValue) 

    console.info('Changed!');
    console.log('Old:' + oldValue);
    console.log('New:' + newValue);

);

所以它应该与手动添加经典的 vanilla javascript EventListener 的含义相同(通过 addEventListener() 在我想在经典的旧 vanilla JavaScript 应用程序(不使用 Angular)中观察的对象上。

当输入值发生变化时,将执行与 whatcher 关联的函数。

好的,这对我来说很清楚。

现在我说我也可以做这样的事情。

html 代码中我可以有类似的东西:

<input type="button" value="Click Me" ng-click="alertClick()" />

在 Angular 控制器中,我会有类似的东西:

$scope.alertClick = function() 
    alert("Clicked !!!");

因此,当按钮上有点击事件时,ng-Click 指令似乎执行了一个 $scope 字段的功能。

但是我可以执行与第一个示例中相同的操作吗?如果按钮通过 ng-model="handle" 指令关联到模型对象,我可以在按钮上声明一个 whatcher 吗?

什么时候使用第一种方法更好,什么时候使用第二种方法更好地处理AngularJS中的事件?

【问题讨论】:

【参考方案1】:

ngModel 用于将输入表单从 UI 绑定到您的控制器

ngClick 只是一个常规的 javascript 表达式,它可以访问将在 click 事件中执行的控制器范围。

这里你必须使用 ng-click。

使用 Angular 的一个好习惯是避免使用 addEventListener() 或 Jquery 等其他函数... 因为 AngularJS 封装了所有这些功能,并且在必要时会运行摘要循环或其他巫术魔法。

【讨论】:

【参考方案2】:

使用点击事件。应该使用 $scope.$watch 来监视某些事情何时发生变化,而不是对事件处理程序更好的事情。

【讨论】:

【参考方案3】:

您指出的两个“方法”不是一回事。完全没有。

第一个,$watch,用于监听 $scope 的变化。您可以指定要监视的范围的哪个属性,并且当发生更改时,它将调用您的回调函数。详情请见Digest cycle documentation。

第二个,ng-click 属性指令,监听 DOM 事件并在事件发生时评估您传入的表达式。

在您的情况下,对于按钮,您有两个选择。您可以使用ng-click 属性指令在您的范围内触发一个函数在您输入的表单html 标记中使用ng-submit 属性指令。这样您就可以使用按钮或按下 Enter 来触发表单验证。

请参阅ngSubmit 的文档。

【讨论】:

【参考方案4】:

ngModel 适用于特定元素,例如 input、select 和 textarea。因此,您不能在按钮上使用 ngModel。这就是你使用 ngClick 来获取点击事件的原因。

【讨论】:

以上是关于在这种情况下,在 AngularJS 中处理事件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS ng-repeat 处理空列表情况

[Angularjs]处理页面闪烁的方法

使用LiveData处理事件

angularJS笔记之Promise

将 keydown 事件定位到 angularJS 自定义指令

angularjs的$on$emit$broadcast