角度:需要从模块注入控制器

Angular: require injected controller from module

本文关键字:模块 注入 控制器 角度      更新时间:2023-09-26

>我正在尝试在我的自定义指令中使用require函数。 但我根本无法让它工作。这就是我得到的:

.JS:

var app = angular.module('main', []);
app.controller('MyController', ['$scope', function($scope){
        var random = Math.random()*10000;
    console.log('init random: ' + random);
    $scope.test = function(controllerName){
        console.log(controllerName + " " + random);
    }
  }]);
  app.directive('myDirective', function(){
    return{
      require: "^MyController",
      link: function(scope, els, attrs, req){
        scope.test('myDirective');
      }
    }
  });
    app.directive('mySecondDirective', function(){
    return{
      require: "^MyController",
      link: function(scope, els, attrs, req){
        scope.test('mySecondDirective');
      }
    }
  });

.HTML:

<div ng-app="main" ng-controller="MyController">
    <my-directive></my-directive>
    <my-second-directive></my-second-directive>
  </div>

https://jsfiddle.net/hr8thyq5/3/

我得到的只是这条错误消息:找不到指令"myDirective"所需的控制器"MyController"!

我还需要做什么才能让它工作?

需要了解原因 -

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

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

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

无论哪种情况,您都必须同时使用这两个指令才能正常工作。 require 是一种在组件之间进行通信的方式。

如需进一步了解,请转到此处:在此处输入链接说明

require中指定的控制器以其指令命名,而不是控制器名称。require的目的是与相对指令的控制器实例(this(通信,这将等于链接函数中的req参数。

因此,它不能仅限于 MyController .如果需要一些抽象的ng-controller控制器(由于这种情况的脆弱性,这没有什么意义(,那么它将是

require: "^ngController",