Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular:创建可调用范围函数的自定义指令_Javascript_Angularjs - Fatal编程技术网

Javascript Angular:创建可调用范围函数的自定义指令

Javascript Angular:创建可调用范围函数的自定义指令,javascript,angularjs,Javascript,Angularjs,我想创建一个自定义指令(我们称之为MyDragSource),它可以通过调用作用域上的函数来获取其“拖动上下文”,如下所示: <div my-drag-source drag-context="getDragContext"> 我希望在拖动操作开始时延迟调用getDragContext,而不是预先计算。我该怎么做 在我的自定义指令中,我尝试了以下操作: $scope.$eval($attrs.dragContext); 但是,这并不能产生期望的结果。您可以这样称呼它: var d

我想创建一个自定义指令(我们称之为MyDragSource),它可以通过调用作用域上的函数来获取其“拖动上下文”,如下所示:

<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: '&'
}