当前位置: 首页 > 面试题库 >

如何通过递归要求访问父指令的控制器?

谯德元
2023-03-14
问题内容

我试图递归地到达父“ box”指令的控制器:

<body ng-app="main">

<!-- no nesting: parent is the just body -->
<box></box>

<script type="text/javascript">
angular.module('main', [])
.directive('box', function() {
    return {
        restrict: 'E',
        controller: function() { },
        require: '?^box',  // find optional PARENT "box" directive
        link: function(scope, iElement, iAttrs, controller) {
            // controller should be undefined, as there is no parent box
            alert('Controller found: ' + (controller !== undefined));
        }
    };
});
</script>
</body>

我希望控制器变量undefined在链接函数中,但是我得到了实际box指令的控制器。

所以我的问题是…在这种情况下如何获得对PARENT控制器的访问权限:

<box>
    <box></box>
</box>

http://jsfiddle.net/gjv9g/1/


问题答案:

好,找到了…

如果要获取父元素的控制器,请执行以下操作:

...
link: function(scope, iElement, iAttrs, controller) {
    // http://docs.angularjs.org/api/angular.element
    // jQuery/jqLite Extras:
    //
    // controller(name) - retrieves the controller of the current element or its parent.
    // By default retrieves controller associated with the ngController directive.
    // If name is provided as camelCase directive name, then the controller for this
    // directive will be retrieved (e.g. 'ngModel').
    var parentCtrl = iElement.parent().controller('box');
}
...

这将返回父指令的控制器,或者返回更高一级的父指令的父指令的控制器。如果您需要确保获得DIRECT父指令的控制器,我发现了这一点(也许有更好的解决方案,我没有知道):

...
controller: function($scope, $element) {
    // store the element in controller, we'll need it later
    this.$element = $element;
},
// works in both pre and post link functions
link: function() {
    var parentElement = $element.parent();
    var parentCtrl = parentElement.controller('box');

    var hasDirectBoxParent = parentCtrl && parentCtrl.$element[0] === parentElement[0];

}
...

范例1:

<box id="a">
    <box id="b"></box>
<box>

在“框a”上调用链接函数时undefined,两种情况下都使用parentCtrl
。在“框b”上调用链接功能时,在两种情况下parentCtrl都是“框a”的控制器。

范例2:

<box id="a">
    <div>
        <box id="b"></box>
    </div>
<box>

在“框a”上调用链接函数时undefined,两种情况下都使用parentCtrl 。当在“ box
b”上调用链接函数时,在两种情况下parentCtrl仍是“ box
a”的控制器,但是hasDirectBoxParent为false,因此您可以将父项与祖父母区分开。



 类似资料:
  • 问题内容: 我可能会考虑将其完全倒退,但是我正在尝试制作三个嵌套指令,让它们称为:屏幕,组件和小部件。我希望窗口小部件能够触发组件中的某些行为,从而触发屏幕中的某些行为。所以: 我可以使用来在小部件的链接fn中要求父组件,但是如何进一步使组件控制器访问其包含的屏幕呢? 我需要的是WHAT in组件,因此,当您单击小部件的按钮时,它会发出“ screeny!”警报。 谢谢。 问题答案: 您可以通过以

  • 问题内容: 我尝试“要求”一个父控制器(不是指令),但是AngularJS返回一个异常。代码是这样的: HTML 错误 错误:找不到指令’myDirective’所需的[$ compile:ctreq]控制器’myController’! 为什么? 也许,属性必须引用 指令 的控制器? 谢谢 问题答案: 要求在另一个指令中使用其他指令控制器,请参考以下示例

  • 问题内容: 谁能告诉我如何在另一个angularJS指令中包含一个指令中的控制器。例如我有以下代码 通过所有帐户,我应该能够使用addProduct指令访问控制器,但是我不能。有更好的方法吗? 问题答案: 我很幸运,并在对问题的评论中回答了这个问题,但是为了完整起见,我发布了完整的答案,因此我们可以将此问题标记为“已回答”。 这取决于您要通过共享控制器来完成的工作。您可以共享同一控制器(尽管实例不

  • 问题内容: 我为其中一个页面设置了一个版式,然后使用大量的小视图作为种子,这些小视图用于填充日期。我的状态目前看起来像这样: 如您所见,父布局将我的Controller保留在称为 EventCtrl 的页面上。现在,我希望所有视图现在都可以访问此控制器,但事实并非如此。相反,我必须将来自 eventLayout 的主要父模板包装到div中,然后在其中使用旧学校: 我至少想了解为什么会发生这种情况,

  • 我在Laravel项目中使用Passport包进行API身份验证。 我通过标头传递访问令牌以验证用户操作。但是,我需要通过API URL发送访问令牌。 这样地: http://aarts.net/rest/api/v1/cart?access_token=vIRTPypU16SuMar6xSK1clzGXOGvOwQPX3WoT71A 我需要通过API URL发送访问令牌。

  • 问题内容: 这不是一件很难的事,但我无法弄清楚如何做到最好。 我有一个父指令,像这样: 和一个子指令: 如何从子指令轻松访问父指令的和属性?在我的链接函数中,我可以访问父级作用域-我应该用来观察这些属性吗? 放在一起,我想拥有的是: 这个想法是默认情况下显示一组字段。如果单击,它们将成为输入并可进行编辑。 问题答案: 从这篇SO帖子中汲取灵感,我在这个笨拙的人中有一个可行的解决方案。 我不得不改变