/ / Angularjs scope. $ Eval non évalué - angularjs, eval

Angularjs scope. $ Eval ne pas évaluer - angularjs, eval

J'utilise un angulaire 1.5.8 qui n'a pas les directives ng-keypress, ng-keydown ou ng-keyup. En tant que tel, je lance mon propre code d’événement de frappe. j'ai trouvé Cet article plus tôt sur StackOverflow, et j'ai modifié le code pour s’intégrer à mon code en modifiant le nom du module et ajouté des alertes de débogage pour voir ce qui se passe:

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>

Je vois les deux alertes du code de la directive, mais l'alerte qui est la cible de la directive et qui devrait être évaluée par $ eval ne s'affiche pas. Qu'est-ce qui ne va pas avec ça?

Réponses:

0 pour la réponse № 1

Ce n’est pas vraiment comment AngularJS fonctionne. Je crois que l'exécution de javascript arbitraire est un risque de sécurité et angularJS ne le permet pas. Le $ eval n'est pas la même chose que le eval de javascript. Son but est d’évaluer une expression dans le contexte d’une portée. Il est généralement utilisé pour développer des liaisons en valeurs concrètes. Considérez l'exemple suivant

 app.controller("bobControler",function($scope) {
$scope.person ={
name:"bob"
}
}

si je devais appeler

alert($scope.eval("person.name"))

cela devrait faire apparaître une alerte avec le texte "bob".

Pour obtenir ce que vous voulez, vous devez fournir à votre directive une entrée de type &. c'est un rappel que angular vous transmettra et que vous pourrez appeler :)

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();
}
});
}

};
});

L'échantillon complet est ici: https://plnkr.co/edit/0Mb7Ggo72oBAyE60QLWD?p=preview