AngularJS $解析不起作用

时间:2014-05-31 09:09:37

标签: javascript angularjs

我试图理解基于documentation的$ 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

2 个答案:

答案 0 :(得分:1)

我还没有使用$ parse方法,但是这段代码符合您的要求:

http://plnkr.co/edit/AVvxLR4RcmWhLo8eqYyd?p=preview

答案 1 :(得分:-1)

据我所知,$parse服务的目的是在隔离范围之外使用。

当你有一个隔离范围时,就像在你的指令中一样,你可以使用Shai的答案中提出的'sayHello': '&'获得对父范围函数的引用。如果您在调用$parse时能够传入父作用域而不是指令的作用域,getter($scope)服务可能仍然按预期工作,即使是使用隔离作用域,但我还没有测试过。< / p>

编辑:确实如此 - 使用getter($scope.$parent)工作正常。在指令中使用隔离范围时,$scope变量不再引用$parse服务返回的getter函数的正确上下文。使用$scope.$parent

访问正确的访问权限

但是,如果您要避免使用隔离范围,那么您的方法效果很好。尝试完全删除指令定义中的scope: { ... }部分,您将看到它正常工作。如果要为事件绑定创建一个指令,并且可以将该指令与另一个具有隔离范围的指令(例如,dragenter指令(Angular未提供))一起应用,则这很方便。在这种情况下,您无法使用Shai的方法,因为隔离范围会发生冲突并且您会收到错误,但您可以使用$parse服务。

这是一个更新的plunker,其中scope已从指令定义中删除:http://plnkr.co/edit/6jIjc8lAK9yjYnwDuHYZ