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

如何在angularjs指令中要求控制器

马庆
2023-03-14
问题内容

谁能告诉我如何在另一个angularJS指令中包含一个指令中的控制器。例如我有以下代码

var app = angular.module('shop', []).
config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/', {
        templateUrl: '/js/partials/home.html'
    })
        .when('/products', {
        controller: 'ProductsController',
        templateUrl: '/js/partials/products.html'
    })
        .when('/products/:productId', {
        controller: 'ProductController',
        templateUrl: '/js/partials/product.html'
    });
}]);

app.directive('mainCtrl', function () {
    return {
        controller: function ($scope) {}
    };
});

app.directive('addProduct', function () {
    return {
        restrict: 'C',
        require: '^mainCtrl',
        link: function (scope, lElement, attrs, mainCtrl) {
            //console.log(cartController);
        }
    };
});

通过所有帐户,我应该能够使用addProduct指令访问控制器,但是我不能。有更好的方法吗?


问题答案:

我很幸运,并在对问题的评论中回答了这个问题,但是为了完整起见,我发布了完整的答案,因此我们可以将此问题标记为“已回答”。

这取决于您要通过共享控制器来完成的工作。您可以共享同一控制器(尽管实例不同),也可以共享同一控制器实例。

共享控制器

通过将相同的方法传递给两个指令,两个指令可以使用同一控制器,如下所示:

app.controller( 'MyCtrl', function ( $scope ) {
  // do stuff...
});

app.directive( 'directiveOne', function () {
  return {
    controller: 'MyCtrl'
  };
});

app.directive( 'directiveTwo', function () {
  return {
    controller: 'MyCtrl'
  };
});

每个指令都将获得其自己的控制器实例,但这使您可以在所需的任意多个组件之间共享逻辑。

需要控制器

如果要共享控制器的相同 实例 ,请使用require

require确保存在另一个指令,然后将其控制器作为链接函数的参数包括在内。因此,如果您在一个元素上有两个指令,则您的指令可能 需要
另一个指令的存在并可以访问其控制器方法。一个常见的用例是require ngModel

^require,加上插入号,除了当前元素外,还会检查指令上方的元素以尝试查找其他指令。这使您可以创建复杂的组件,其中“子组件”可以通过其控制器与父组件进行通信,从而产生很大的效果。示例可以包括选项卡,其中每个窗格都可以与总体选项卡通信以处理切换;手风琴装置可以确保一次只打开一个;等等

无论哪种情况,都必须同时使用这两个指令。require是组件之间通信的一种方式。

请查看指令指南页面以获取更多信息:http :
//docs.angularjs.org/guide/directive



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

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

  • 问题内容: 我正在尝试使用AngularJS创建我的第一个应用程序。但是,如果我需要针对特定​​情况使用指令,我会感到困惑。 我有一个简单的“地图”页面,需要在其中显示所选区域的纬度/经度值。目前,我根本没有使用指令。我在控制器中执行所有操作,并使用局部显示结果。我不打算在其他任何地方重用我的地图视图。这就是为什么我不觉得我需要指令。 另一方面,我读到某个地方,每次您尝试在控制器中操作DOM(我正

  • 问题内容: 我试图递归地到达父“ box”指令的控制器: 我希望控制器变量在链接函数中,但是我得到了实际box指令的控制器。 所以我的问题是…在这种情况下如何获得对PARENT控制器的访问权限: http://jsfiddle.net/gjv9g/1/ 问题答案: 好,找到了… 如果要获取父元素的控制器,请执行以下操作: 这将返回父指令的控制器,或者返回更高一级的父指令的父指令的控制器。如果您需要

  • 问题内容: 我想触发一个包含jQuery指令的AngularJS自定义指令。如何做呢?我已经在指令中阅读了关于发射功能的信息? 想法? 问题答案: 您可以使用服务在控制器和指令之间进行通信。 服务可能如下所示: 该指令可以响应服务: 只需将我所做的替换为jQuery操作,您就应该拥有所需的东西。 这是一个有效的小提琴:http : //jsfiddle.net/jeremylikness/wqXY

  • 问题内容: 我喜欢使用指令制作自定义组件。我检查了很多教程,它使我感到困惑,任何人都可以解释指令的工作原理。我计划制造的组件是 呼喊列表的模板将像这样 问题答案: 这是您的指令,带有一些内联注释: 和模板文件: 现在,您可以在代码中使用它,如下所示: 控制器: 视图: 希望这可以帮助!