Javascript Angular:创建可调用范围函数的自定义指令
我想创建一个自定义指令(我们称之为MyDragSource),它可以通过调用作用域上的函数来获取其“拖动上下文”,如下所示:Javascript Angular:创建可调用范围函数的自定义指令,javascript,angularjs,Javascript,Angularjs,我想创建一个自定义指令(我们称之为MyDragSource),它可以通过调用作用域上的函数来获取其“拖动上下文”,如下所示: <div my-drag-source drag-context="getDragContext"> 我希望在拖动操作开始时延迟调用getDragContext,而不是预先计算。我该怎么做 在我的自定义指令中,我尝试了以下操作: $scope.$eval($attrs.dragContext); 但是,这并不能产生期望的结果。您可以这样称呼它: var d
<div my-drag-source drag-context="getDragContext">
我希望在拖动操作开始时延迟调用getDragContext,而不是预先计算。我该怎么做
在我的自定义指令中,我尝试了以下操作:
$scope.$eval($attrs.dragContext);
但是,这并不能产生期望的结果。您可以这样称呼它:
var data = $scope[$attrs.dragContext]();
将函数作为指令的属性传递:
在指令中使用隔离作用域,并使用&
导入dragContext
,该命令将作用域属性定义为一个函数,该函数返回对父作用域中属性内容的求值结果(在本例中为$scope.$parent.$eval(attrs.dragContext)
):
然后,您可以随时在link
函数中调用该函数:
$scope.dragContext()
如果您传递的方法没有括号,您仍然可以从链接
函数调用它,您只需要通过添加另一组参数来调用该函数:
$scope.dragContext()()
除非您使用()
实际执行它,否则不会调用它。您能显示指令的代码吗?现在,您正在为函数指定一个属性,而不是函数的结果,但您似乎正在尝试对指令内的变量求值,就像它在范围外一样……非常好,非常感谢!只需一个小的更正:在上面的范围定义中,您需要“dragContext:”而不是“dragContext:”@Wolf只需确保您了解范围隔离在这个解决方案中的作用。仅为正确起见,&并不表示对外部函数的引用。它只是将函数dragContext添加到返回$scope.$parent.$eval(atts.dragContext)的指令作用域的缩写。表达式attrs.dragContext可以是任何有效的角度表达式,而不仅仅是方法调用或方法。@JoeEnzminger感谢您提供此附加信息,我将更新
var data = $scope[$attrs.dragContext]();
scope: {
dragContext: '&'
}