AngularJS:推荐通过回车触发函数的方式
AngularJS: recommended way of triggering a function via enter
考虑一个应用程序,在该应用程序中,可以通过输入文本字段,然后按enter键来触发数据库搜索。搜索结果应立即显示。
为了实现这一点,我创建了一个输入元素,并赋予它一个指令属性:
<input search-shipment type="text">
// Directive
Shipment.directive('searchShipment',function(){
return{
restrict: 'A',
link: function(scope,element){
element.bind('keydown',function(e){
if (e.which === 13){
scope.shipment.fetchShipment();
}
})
}
}
});
触发的功能:
Shipment.prototype.fetchShipment = function(){
$http.post('../sys/core/fetchShipment.php',{
// some data to POST
}).success(function(data){
console.log(data);
});
console.log(finished);
};
这引起了一些奇怪的行为。该功能被触发,"完成"被记录到控制台。然而,success()
显然被延迟触发,data
直到我做出另一个输入才被记录,该输入必须与返回不同
现在我已经发现,我可以通过使用表单作为输入元素的包装器,然后使用ng-submit来触发我的函数来避免这种行为。
然而,我想知道一些事情:
- 为什么我的第一个基于指令的解决方案不能正常工作
- 如果不使用表单,我如何实现目标
- 即使使用工作表单解决方案,第二个
console.log()
也会在记录数据之前触发。为什么会这样
仅根据描述很难确定诊断,没有实时代码,但有两件事需要注意:
-
您的问题可能与使用AngularJS 1.1.x版本中添加了请求拦截器的
$http
有关。因此,$http
调用需要在$digest
循环内完成。试着把你的电话包装成scope.$apply
,就像这样:link: function(scope,element){ element.bind('keydown',function(e){ if (e.which === 13){ scope.$apply(function(){ scope.shipment.fetchShipment(); }); } }) }
-
如果您仍在使用1.1.x,则可以使用现有的ngKeyDown指令,而不是推出自己的指令。
相关文章:
- 在phonegap中为android调用onload函数的最佳方式
- 以不同的方式调用javascript函数
- 我想以异步方式执行常规函数
- 有没有一种优雅的方式来告诉esint,以确保我们're没有使用任何ES6语法/函数
- 我想要相同的函数以两种方式反应
- 如果变量不是't已传递给函数.这是正确的方式吗
- 以编程方式调用javascript函数
- 为什么模块化幂函数在 Python 和 Javascript 中对于大数字的工作方式不同
- Javascript - 以编程方式执行所有函数输入的方法
- 以 func(a)(b)(c) 的方式调用的 Javascript 函数
- 如何获取以编程方式定义nodejs函数的位置
- 在Javascript构造函数中定义属性的正确方式
- Angular:将对象存储在服务中以在视图中显示和将crud函数存储到服务器的最佳方式是什么
- 另一种方式是Javascript中的函数堆叠
- 如何制作一个JavaScript函数,处理多组输入,以同样的方式进行数学处理
- 以两种不同的方式使用函数
- JavaScript 对象,使用两种不同的调用函数方式查看预期结果
- 调用JavaScript函数方式的性能问题
- 在JavaScript中以函数方式提取属性和值
- 以函数方式修改对象的属性