Eu estou usando o angular 1.5.8 que não tem as diretivas ng-keypress, ng-keydown ou ng-keyup. Como tal, eu estou rolando meu próprio código de evento keypress. eu encontrei Este artigo anteriormente no StackOverflow, e modifiquei o código para se ajustar ao meu código, modificando o nome do módulo e adicionando alertas de depuração para ver o que está acontecendo:
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>
Estou vendo os dois alertas do código da diretiva, mas o alerta que é o alvo da diretiva e que deve ser avaliado pelo $ eval não está sendo exibido. O que está errado com isso?
Respostas:
0 para resposta № 1Isso não é realmente como o AngularJS funciona. Acredito que executar javascript arbitrário é um risco de segurança e o angularJS não permite isso. O $ eval não é o mesmo que eval do javascript. Seu objetivo é avaliar uma expressão no contexto de um escopo. Ela é geralmente usada para expandir as ligações em valores concretos. Considere o seguinte exemplo
app.controller("bobControler",function($scope) {
$scope.person ={
name:"bob"
}
}
se eu fosse ligar
alert($scope.eval("person.name"))
isso deve aparecer um alerta com o texto "bob".
Para alcançar o que você deseja, você deve fornecer uma entrada para sua diretiva que seja do tipo &. este é um callback que angular vai passar para você e você pode chamar :)
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();
}
});
}
};
});
A amostra completa está aqui: https://plnkr.co/edit/0Mb7Ggo72oBAyE60QLWD?p=preview