AngularJS on enter指令在表单输入中没有保存模型值。
AngularJS on enter指令在表单输入中没有保存模型值。
我在页面上有以下内容 - 完整的代码在这个Plunker中。
页面上有一个自定义的onEnter
指令,当在聊天表单输入上按下回车键时调用一个函数。下面是代码片段:
//**HTML视图**
- {{chat.username}} {{chat.message}}
问题是输入框(message
)的值没有保存到作用域模型(chat
)中。如果我移除onenter
指令,它就能正常工作。我在这里漏掉了什么?任何帮助将是很棒的。
AngularJS中的onEnter指令在表单输入上没有保存模型值的问题的原因是没有正确使用$scope.$apply()方法来更新模型。解决方法是使用$scope.$apply()方法包裹$scope.onEnter()函数。
在AngularJS 1.2版本中,可以通过以下方式编写代码:
var app = angular.module('application', []); app.directive('onEnter', function() { return { scope: {onEnter: '&'}, link: function(scope, element) { console.log(scope); element.bind("keydown keypress", function(event) { if(event.which === 13) { scope.$apply(function(){ scope.onEnter(); }); } }); } } });
通过这种改进的解决方案,我们在$scope.$apply()方法中使用了一个函数来执行$scope.onEnter()函数,这样就能正确地更新模型值了。
AngularJS中的一个问题是,在表单输入框中使用"on enter"指令时无法保存模型的值。通过研究发现,问题的根源在于指令中定义了一个新的子作用域。为了解决这个问题,需要移除scope的声明,并使用attrs对象中的函数值。
具体的解决方法如下:
app.directive('onEnter',function() { var linkFn = function(scope,element,attrs) { element.bind("keypress", function(event) { if(event.which === 13) { scope.$apply(function() { scope.$eval(attrs.onEnter); }); event.preventDefault(); } }); }; return { link:linkFn }; });
通过这种方式,不再创建隔离的作用域,避免与其他可能应用于相同DOM元素的隔离作用域指令发生冲突。
完整的代码可以在plunker上查看:[plunker链接](http://plnkr.co/edit/Rk4aAG?p=preview)
虽然这种解决方法使用了$eval,个人并不是很喜欢。但是,我意识到这种解决方案有一个重要的优点:它不会创建隔离作用域,因此不会与其他潜在的隔离作用域指令发生冲突。