这个头衔是满满的!我有一些由其他开发人员写的代码,他们在休假时无法解释自己。我们这些离开办公室的人都无法弄清楚它为什么会起作用。任何帮助将不胜感激!
我们有许多指令使用控制器中定义的函数的结果作为属性之一。控制器上的方法看起来像这样。
$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>
这为我提出了各种问题。我认为对必需的调用是在父作用域中执行的,所以我不理解它是如何使用看似在模板中赋值的变量的。此外,对象通常作为单个参数传递,但它们似乎已在此处拆分以提供所需的两个参数。
我非常想了解这是如何运作的,所以任何帮助或解释都会非常感激!
答案 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>
我理解语法可能有点误导,但在这里我们没有调用该函数,我们指定fieldpath
和item
是稍后将使用的键。调用阶段。
现在在子范围内,您可以调用函数作为参数传递给map,其中每个键代表一个参数名称,相应的值代表值本身。
在你的情况下:
<normal-directive
isrequired='required({fieldpath:'Path.to.property', item: object})'></normal-directive>
最后但并非最不重要的是,只有在评估参数后才会对功能进行评估。
希望这会有所帮助。