/ / Angularjs scope. $ Eval não avaliando - angularjs, eval

Angularjs scope. $ Eval não avaliando - angularjs, eval

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 № 1

Isso 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