我试图理解基于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();
});
}
};
});
答案 0 :(得分:1)
我还没有使用$ parse方法,但是这段代码符合您的要求:
答案 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