2016-03-29 16 views
2

AngularJS'de özel bir yönerge yazdım. Ve $ transclude isSlotFilled yöntemini kullanmalıyım. Yönergenin yönergesi:

define(['../directives-module'], function (directivesModule, $scope, $transclude) {  
    directivesModule.directive('news', function() { 
     return {   
      restrict: 'E', 
      replace: true, 
      transclude: { 
       'heading': 'heading', 
       'content': '?content' 
      }, 
      scope: { 
       'cmsContent': '@' 
      }, 
      templateUrl: 'directives/news.html', 
      link: function(scope, element, attrs, ctrl, transclude){ 
       console.log($transclude.isSlotFilled(content)); 
      }, 
     }; 
     });  
}); 

Yöntemin çalışıp çalışmadığını kontrol etmek için bir konsol.log() çıkışı çıkarmaya çalıştım. console.log() Yukarıdaki söyleyerek çalışmaz:

TypeError: Cannot read property 'isSlotFilled' of undefined

Aslında direktifin HTML dosyası üzerinde bu yöntemi kullanmak zorunda. Dosya news.html içerir: içerik yuvası dolu değilse

Eğer ng sınıf gördüğünüz gibi
<div class="row"> 
    <div class="largeText shadow1" ng-transclude="heading"></div> 
    <div class="mediumText shadow2" ng-transclude="content" 
     ng-class="{'hide' : $transclude.isSlotFilled(content)}"> 
    </div> 
</div> 

, bu div gizler. Ancak burada ng-class içindeki koşul her zaman yanlıştır. Eminim, $ transclude enjekte ederek bir şey eksik. Bu yöntemi news.html'den düzgün bir şekilde kullanmak için ne yapmalıyım?

+0

Kullandığınız açısal sürüm hangisi? –

+0

@VishalRajole 1.5.0 Olduğunda –

+0

Yönlendirmeye $ transclude enjekte etmiyorsunuz, her neyse. Bir modül mü? Hizmet? Bu konuda hiçbir şey söylenmiyor. – estus

cevap

2

Modül sisteminizi kullanarak ne yapmaya çalıştığınızdan emin değilim, ancak her durumda: $transclude bir hizmet değil, yönerge ve bileşen denetleyicileri için enjekte edilebilir bir işlev değildir. Aynı şey $scope için de geçerlidir.

Bağlantı işlevi, transclude işleviyle çağrılır, böylece doğrudan kullanabilirsiniz. Ayrıca, content civarında tırnak koymayı da unutmayın.

define(['../directives-module'], function (directivesModule) {  
    directivesModule.directive('news', function() { 
     return {   
      restrict: 'E', 
      replace: true, 
      transclude: { 
       'heading': 'heading', 
       'content': '?content' 
      }, 
      scope: { 
       'cmsContent': '@' 
      }, 
      templateUrl: 'directives/news.html', 
      link: function(scope, element, attrs, ctrl, transclude){ 
       console.log(transclude.isSlotFilled('content')); 
      }, 
     }; 
     });  
}); 

Bir şablona erişmek için bunu özellik olarak ekleyebilirsiniz. Bunu yapmak istiyorsanız, bağlantı işlevinde bunu yapabilirsiniz:

function(scope, element, attrs, ctrl, transclude){ 
    console.log(transclude.isSlotFilled('content')); 
    scope.transclude = transclude; 
} 

// Or maybe 
function(scope, element, attrs, ctrl, transclude){ 
    console.log(transclude.isSlotFilled('content')); 
    scope.hasContent = transclude.isSlotFilled('content'); 
} 
+0

TEŞEKKÜRLER. Ben 'transclude' işlevi –

+0

yardım almak için nasıl tutulacağını anladım hayatın için değil. :) Kabul edilen cevap olarak işaretleyebilir misiniz? Teşekkürler –

+0

bu benim sorum değil ama Eminim Yazıcı size yardımcı olabilir –