AngularJS $parse不起作用



我试图理解$parse,基于文档。但是我有麻烦让我的测试代码工作。我使用$parse服务的方式正确吗?

代码的主要部分是:

app.directive('try', function($parse) {
  return {
    restrict: 'E',
    scope: {
      sayHello: "&hello"
    },
    transclude: true,
    template: "<div style='background:gray;color:white'>Hello I am try: <span ng-transclude></span><div>",
    link: function($scope, $elem, $attr) {
      var getter = $parse($attr.sayHello);
      // var setter = getter.assign;
      $elem.on('click', function() {
        getter($scope);
        $scope.$apply();
      });
    }
  };
});

查看我的代码:http://plnkr.co/edit/lwV5sHGoCf2HtQa3DaVI

我没有使用$parse方法,但是这段代码实现了您正在寻找的:

http://plnkr.co/edit/AVvxLR4RcmWhLo8eqYyd?p =预览

据我所知,$parse服务旨在在隔离作用域之外使用。

当你有一个隔离作用域时,就像在你的指令中一样,你可以像Shai的回答中建议的那样使用'sayHello': '&'来获得对父作用域函数的引用。$parse服务可能仍然像预期的那样工作,即使有一个孤立的作用域,如果你能够在调用getter($scope)时传递父作用域而不是指令的作用域,但我还没有测试过。

Edit:这确实是这种情况-使用getter($scope.$parent)工作得很好。当在指令中使用隔离作用域时,$scope变量不再指向$parse服务返回的getter函数的正确上下文。使用$scope.$parent访问正确的。

但是,如果您要避免使用孤立作用域,那么您的方法就可以很好地工作。试着从你的指令定义中完全删除scope: { ... }部分,你会发现它工作得很好。如果你要创建一个用于事件绑定的指令,它可能会与另一个具有隔离作用域的指令(比如dragenter指令(Angular没有提供))一起应用于一个元素,这是很方便的。在这种情况下,你不能使用Shai的方法,因为隔离作用域会发生冲突,你会得到一个错误,但是你可以使用$parse服务。

这是一个更新的柱塞与scope从指令定义中删除:http://plnkr.co/edit/6jIjc8lAK9yjYnwDuHYZ

最新更新