Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.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 使用name属性的动态指令控制器_Javascript_Angularjs - Fatal编程技术网

Javascript 使用name属性的动态指令控制器

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

我试图用动态控制器实现指令,这样我就可以根据某些条件绑定控制器,就像Todd的座右铭所示

一切正常,除了我不能将对象属性作为名称发送到指令

<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
      });
    });
  }
});