我正在使用angular 1.5.8,它没有ng-keypress,ng-keydown或ng-keyup指令。因此,我正在滚动自己的按键事件代码。我之前在StackOverflow上找到了this article,并通过修改模块的名称修改了代码以适应我的代码,并添加了调试警报以查看发生了什么:
appModule.directive('myEnter', function () {
return function (scope, element, attrs) {
element.bind("keydown keypress", function (event) {
alert("Here2");
if(event.which === 13) {
scope.$apply(function (){
alert(attrs.myEnter);
scope.$eval(attrs.myEnter);
});
event.preventDefault();
}
});
};
});
<input type="text" ng-model="zzz" my-enter="alert('Here')"></input>
我看到来自指令代码的两个警报,但是作为指令目标的警报以及应该由$ eval评估的警报未显示。这有什么问题?
答案 0 :(得分:0)
这并不是AngularJS的工作原理。我认为运行任意javascript是一种安全风险,而angularJS不允许这样做。 $ eval与javascript的eval不同。它的目的是评估范围内容中的表达。它通常用于将绑定扩展为具体值 请考虑以下示例
app.controller('bobControler',function($scope) {
$scope.person ={
name:'bob'
}
}
如果我打电话
alert($scope.eval('person.name'))
这应该会弹出一个警告,其中包含文字&#39; bob&#39;。
为了达到你想要的效果,你应该为你的指令提供类型&amp;的输入。这是一个回调,角度将传递给你,你可以调用:)
app.directive('myenter', function() {
return {
restrict: 'A',
scope: {
myenter:'&'
},
link: function(scope, element, attrs) {
element.bind("keydown keypress", function(event) {
if (event.which === 13) {
alert("Here2");
scope.$evalAsync(()=>scope.myenter());
event.preventDefault();
}
});
}
};
});