Angularjs范围。$ eval未评估

时间:2018-02-24 15:26:32

标签: angularjs eval

我正在使用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评估的警报未显示。这有什么问题?

1 个答案:

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

  };
});

完整示例位于:https://plnkr.co/edit/0Mb7Ggo72oBAyE60QLWD?p=preview