2015-06-05 16 views
9

Bir ana denetleyiciyi (yönerge değil) "gerektirme" ye çalışıyorum ancak AngularJS bir istisna döndürüyor. Kod şu şekildedir:Bir Ebeveyn Denetleyicisine gereksinim duyulması için Direktifte "gereksinim" ifadesinin kullanılması

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> 

Hata

Error: [$compile:ctreq] Controller 'myController', required by directive 'myDirective', can't be found!

Neden?
Belki, require özelliği yönergesi yönergesine başvuruda bulunmalıdır?

Teşekkür

+2

Sen 'require' mülkiyet diğer direktifler denetleyicileri başvurulması amacıyla olduğunu doğru bakın. – Chev

+0

Şüphelendim, ancak bana bu kesinliği vermek için resmi belgelerde hiçbir şey bulamadı. Teşekkürler Alex. – riofly

cevap

5

başka yönergede diğer direktifler denetleyicileri kullanmanın olduğunu gerektir, aşağıdaki örneği

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

    } 

    }) 
4

Notasyon require: "^myController" senin direktifi my-controller nitelik veya <my-controller> etiketi olarak atası etiketlerinden bazılarını başka direktif myController denilen ve tanımlanmış erişmeye çalışacağı anlamına gelir. Sizin durumunuzda böyle bir direktifiniz yok, dolayısıyla istisna.

Bu Yapmaya çalıştığınız ne çok geleneksel değil, ama sen gerçekten sizin yönergede dış denetleyici gerektiren istiyorsanız ngController gerektirebilir:

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

Ancak bu çok iyi bir fikir değildir . Buna neden ihtiyacın olabileceğini hayal bile edemiyorum. scope yapılandırma özelliklerine bakmanızı ve çalıştırılabilir işlev referanslarını dış denetleyicinizden yönergelerinize nasıl geçirebileceğinizi öneririm.

scope: { 
    someCallback: '&' 
} 

nerede denetleyicisi size $scope.test = function() {}; olurdu:

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

ve yönergede

kapsamını tanımlar. Daha sonra direktifte açıkça kontrolöre gerek duymayacaksınız.

+1

Evet, özellik özelliği, @riofly yapmaya çalıştığınız şey için değil. Direktiflerin, küçük bir denetleyici API'si aracılığıyla diğer direktiflerle konuşması içindir. Örneğin, yönergelerinizi 'ngModel' direktifiyle çalışacak şekilde kullanmaya ihtiyaç duyduysanız, bu özelliği' ngModel''in denetleyicisini gerektirecek şekilde kullanacaksınız, böylece küçük bir API gibi bir şeyleri arayabilirsiniz. Yönergeler ve denetleyiciler arasında veri paylaşmanız gerekiyorsa, hizmetlere ve çeşitli yalıtma kapsamı bağlama sözdizimlerine bakın. – Chev

İlgili konular