【问题标题】:Using "require" in Directive to require a parent Controller在指令中使用“require”来要求父控制器
【发布时间】:2015-06-05 18:31:24
【问题描述】:

我尝试“要求”一个父控制器(不是指令),但 AngularJS 返回一个异常。代码是这样的:

JS

app.controller("myController", function ($scole) {
    ...
});

app.directive("myDirective", function ($q) {
    return {
        require: "^myController",
        template: "",
        link: function (scope, element, attrs, myCtrl) {
            ...
        }
    };
});

HTML

<div ng-controller="myController as myCtrl">
    ...
        <div my-directive>...</div>
    ...
</div>

错误

错误:[$compile:ctreq] 控制器“myController”,需要 指令“myDirective”,找不到!

为什么?
也许,require 属性必须引用 directive 的控制器?

谢谢

【问题讨论】:

  • require 属性用于引用其他指令的控制器是正确的。
  • 我曾怀疑过,但在官方文档中找不到任何可以确定的内容。谢谢亚历克斯。

标签: angularjs


【解决方案1】:

Require 是在另一个指令中使用其他指令控制器,请参考下面的示例

var App =  angular.module('myApp',[]);

//one directive

App.directive('oneDirective',function(){

  return {
      restrict: 'E',
      controller:function($scope){

       $scope.myName= function(){
            console.log('myname');
          }

         }
    }

});

   //two directive

  App.directive('twoDirective',function(){

  return {
      require:'oneDirective' //one directive used,
      link : function(scope,ele,attrs,oneCtrl){
         console.log(oneCtrl.myName())
     }

   }

  })

【讨论】:

  • 这两个指令需要相互关联吗?就像他们需要共享一个共同的父母或其他东西一样。
【解决方案2】:

符号require: "^myController" 表示您的指令将尝试访问另一个名为myController 的指令,并在某些祖先标记上定义为my-controller 属性或&lt;my-controller&gt; 标记。在您的情况下,您没有这样的指令,因此例外。

这不是你想要做的很传统的事情,但如果你真的想在你的指令中要求外部控制器,你可以要求ngController

app.directive("myDirective", function($q) {
    return {
        require: "^ngController",
        template: "",
        link: function(scope, element, attrs, myCtrl) {
            // ...
            console.log(myCtrl);
        }
    };
});

但是,这不是一个好主意。我无法想象你为什么会需要它。我建议查看scope 配置属性以及如何将可执行函数引用从外部控制器传递到指令中。

<div my-directive some-callback="test()"></div>

并在指令中定义范围:

scope: {
    someCallback: '&'
}

您将在控制器中的哪个位置拥有$scope.test = function() {};。那么你就不需要在指令中明确要求控制器了。

【讨论】:

  • 是的,require 功能并不真正适合您正在尝试做的事情@riofly。指令通过一个小的控制器 API 与其他指令对话。例如,如果您需要您的指令与ngModel 指令一起使用,那么您将使用此功能来要求ngModel 的控制器,这样您就可以像一个小API 一样调用它的东西。如果您需要在指令和控制器之间共享数据,请查看服务和各种隔离范围绑定语法。
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多