Javascript 使用name属性的动态指令控制器
我试图用动态控制器实现指令,这样我就可以根据某些条件绑定控制器,就像Todd的座右铭所示 一切正常,除了我不能将对象属性作为名称发送到指令Javascript 使用name属性的动态指令控制器,javascript,angularjs,Javascript,Angularjs,我试图用动态控制器实现指令,这样我就可以根据某些条件绑定控制器,就像Todd的座右铭所示 一切正常,除了我不能将对象属性作为名称发送到指令 <directive-with-dynamic-controller ctrl="someObj.prop"></directive-with-dynamic-controller> 我甚至试过这个,但是没有用: <directive-with-dynamic-controller ctrl="{{someObj.prop
<directive-with-dynamic-controller ctrl="someObj.prop"></directive-with-dynamic-controller>
我甚至试过这个,但是没有用:
<directive-with-dynamic-controller ctrl="{{someObj.prop}}"></directive-with-dynamic-controller>
它给出如下错误:
参数不是函数,未定义
有没有办法解决这个问题?还是其他方式?
谢谢
有没有办法解决这个问题?还是其他方式?谢谢
问题在于执行的顺序。上面提到的文章中遗漏了一个事实,即在设置“动态”控制器的情况下,无法传递表达式(动态控制器就这么多了)
如果我们查看指令编译步骤的符号,您会注意到,没有对当前$scope
的访问
这是因为DOM编译和控制器初始化发生在角度解析器启动并计算表达式之前
因此,不能将$scope表达式传递到ctrl
属性中,因为此时它只是一个常规DOM属性。本质上,您正在将原始字符串传递到ctrl
属性中
<my-custom-dir ctrl="foo.bar"></my-custom-dir>
// Error: "foo.bar" is not a controller // is not a function // $minErrObscureStuffThatDoesnHelpYou.
实际上,您可以使用通过attrs.ctrl
属性传递的名称匹配的控制器来替换预先初始化的控制器(不执行任何操作)。然而,这将执行后期编译,所以我不会认真推荐它
tl;dr目前还没有一种灵活的方法可以基于$scope表达式为指令定义控制器。它必须是一个原始字符串,因为编译的范围不是基于每个组件,而是按照“全局”执行顺序
DOM编译>控制器初始化>范围链接
someObj
的结构是什么?someObj={“type”:“someValue”}这并没有真正的帮助。你的控制器应该是一个函数。someObj.prop
是函数吗?您好@yarons,根据Todd的文章,您在指令中向ctrl属性传递一个字符串,该字符串应该是将绑定到指令的控制器函数的名称。在这种情况下,代码实际上不是必需的,因为它与给定对象的结构无关。它与DOM编译和后台执行顺序有关。上面提到的文章没有提到这种方法的局限性。嘿,卡斯珀,谢谢你对它的正确解释。这可能是一种将控制器动态附加到指令的有效方法,但角度架构设计阻止了它。
.directive('...', function ($controller) {
controller: function ($scope, $element, $attrs) {
$attrs.$observe('ctrl', function (n, o) {
return $controller(n, {
$scope: $scope,
$element: $element,
$attrs: $attrs
});
});
}
});