/ / Angularjs scope. $ Eval not evaluating - angularjs, eval

Zakres Angularjs. $ Eval nie ocenianie - angularjs, eval

Używam kątowego 1.5.8, który nie ma klawiszy ng-keypress, ng-keydown lub ng-keyup. W związku z tym uruchamiam własny kod zdarzenia keypress. znalazłem Ten artykuł wcześniej w StackOverflow i zmodyfikowałem kod tak, aby pasował do mojego kodu, modyfikując nazwę modułu i dodając ostrzeżenia o debugowaniu, aby zobaczyć, co się dzieje:

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>

Widzę dwa alerty z kodu dyrektywy, ale alert, który jest celem dyrektywy i który powinien zostać oceniony przez $ eval, nie jest wyświetlany. Co jest nie tak z tym?

Odpowiedzi:

0 dla odpowiedzi № 1

Tak naprawdę nie działa AngularJS. Uważam, że uruchamianie dowolnych javascriptów jest zagrożeniem bezpieczeństwa i kątowe JS nie pozwala na to. $ Eval to nie to samo co eval z javascript. Jego celem jest ocena wyrażenia w kontekście zakresu, który jest zwykle używany do rozszerzania powiązań do konkretnych wartości Rozważmy następujący przykład

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

gdybym zadzwonił

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

powinno to wywołać alert z tekstem "Bob".

Aby osiągnąć to, co chcesz, powinieneś podać dane wejściowe do twojej dyrektywy, która jest typu i. jest to wywołanie zwrotne, które kątowe przejdzie do ciebie i możesz zadzwonić :)

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

};
});

Pełna próbka jest tutaj: https://plnkr.co/edit/0Mb7Ggo72oBAyE60QLWD?p=preview