Javascript对象作为Angular指令属性中的函数参数

时间:2017-04-12 20:00:50

标签: javascript angularjs angularjs-directive angularjs-scope

这个头衔是满满的!我有一些由其他开发人员写的代码,他们在休假时无法解释自己。我们这些离开办公室的人都无法弄清楚它为什么会起作用。任何帮助将不胜感激!

我们有许多指令使用控制器中定义的函数的结果作为属性之一。控制器上的方法看起来像这样。

$scope.required = function(pathString, object){
  /*
    pathString is a string representation pointing to a property in object
    object is 
    Returns true/false for the property described 
    in the path string and the state of the object.
  */
}

通常,当我们将它用作html文件中指令实现的属性值时,它看起来像这样。

<normal-directive
  isrequired='required("Path.to.property", object)'></normal-directive>

奇怪的指令在声明中并不起眼。它的定义与普通指令相同。

directive('weirdDirective', function(){
  return {
    restrict: 'E',
    scope: {
      required: '&isrequired'
    },
    templateUrl: 'path/to/template'
  }
});

奇怪的是在实施中。而不是传递给普通指令中的函数的字符串和对象,这两个新的变量fieldpath和item出现。

<weird-directive
 isrequired='required(fieldpath, item)'></weird-directive>

变量fieldpath和item不会出现在控制器或奇怪的指令声明中的任何位置。但是,它们存在于奇怪的指令模板中,如下所示。

<div class='weird-directive'>
 <normal-directive
   isrequired='required({fieldpath:'Path.to.property', item: object})'></normal-directive>
</div>

这为我提出了各种问题。我认为对必需的调用是在父作用域中执行的,所以我不理解它是如何使用看似在模板中赋值的变量的。此外,对象通常作为单个参数传递,但它们似乎已在此处拆分以提供所需的两个参数。

我非常想了解这是如何运作的,所以任何帮助或解释都会非常感激!

1 个答案:

答案 0 :(得分:1)

  

&#34;我认为对必需的调用是在父范围&#34;

中执行的

正确,该函数在父范围内进行评估。

  

&#34;所以我不明白它是如何使用看似变量的   在模板&#34;

中分配了一个值

不完全是,发生的事情略有不同。

让我们检查一下DDO。

return {
    restrict: 'E',
    scope: {
      required: '&isrequired'
    },
    templateUrl: 'path/to/template'
  }

和父作用域中的函数:

$scope.required = function(pathString, object){

}

&符号表示将引用传递给函数,正如您所提到的那样,该函数在父作用域中被评估,但是文档说明如果该方法需要一些参数,则必须传递函数这些参数的名称:

<weird-directive
 isrequired='required(fieldpath, item)'></weird-directive>

我理解语法可能有点误导,但在这里我们没有调用该函数,我们指定fieldpathitem是稍后将使用的键。调用阶段。

现在在子范围内,您可以调用函数作为参数传递给map,其中每个键代表一个参数名称,相应的值代表值本身。

在你的情况下:

<normal-directive
   isrequired='required({fieldpath:'Path.to.property', item: object})'></normal-directive>

最后但并非最不重要的是,只有在评估参数后才会对功能进行评估。

希望这会有所帮助。