我试图理解$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