2014-04-30 19 views
31

Denetleyici adını AngularJS'deki geçerli $ kapsamından elde etmenin bir yolu var mı?

+0

Ne yapmaya çalışıyorsunuz? Bunu bilmek isterseniz, kontrol cihazınızın ismini '$ scope.controllerName' üzerinde bırakabilirsiniz. –

+0

Haklısınız, ancak bu çok kullanışlı değil çünkü ben ve benimle işbirliği yapan herkesin denetleyicinin adını $ kapsam değişkenine koyduğunu hatırlamanız gerekiyor. –

cevap

5

Hayır, bu mümkün değil. Ne $scope direktifine aitse? Kapsamın ait olduğu denetleyici hakkında bilgi alabilecek hiçbir özellik yoktur.

+0

Sorunuz, düşündüğüm ilk sorun oldu. Yani angularJs'in temel hakkını kullanmadan bunu yapmanın bir yolu yok mu? –

+1

@tommasocapelli Hiç bir yolu yoktur. Adı bir özellik olarak manuel olarak atamanız gerekir. – Engineer

+0

Çok teşekkür ederim, eğer denetleyicinin adını $ kapsamına almanın başka bir yolunu bulamadıysam, bu benim çözümüm olurdu. –

27

Bunun iyi bir çözüm olduğundan emin değilim, ama bu teknik kullanılarak $scope.controllerName enjekte başardı:

app.config(['$provide', function ($provide) { 
    $provide.decorator('$controller', [ 
     '$delegate', 
     function ($delegate) { 
      return function(constructor, locals) { 
       if (typeof constructor == "string") { 
        locals.$scope.controllerName = constructor; 
       } 
       return $delegate(constructor, locals); 
      } 
     }]); 
}]); 

Sonra

app.controller('SampleCtrl', ['$scope', '$log', function ($scope, $log) { 
    $log.log("[" + $scope.controllerName +"] got here"); 
}]); 
+11

Paylaşım için teşekkürler. Kod, açısal 1.2.x'te iyi çalışır ancak 1.3'te bozulur. demo: http://jsbin.com/muqipe/3/edit?html ,console ,output Kaynak kodunu izledikten sonra, 1.3 için iki argüman eksik olduğunu buldum, bu yüzden "function (constructor, locals, sonra, başvuru için "ve" $ delege (kurucu, yerliler, daha sonra, girinti) " – Darkthread

+0

Darkthread, bir kurtarıcı ve başlangıç ​​cevabını sunduğunuz için aynı şeyi yazıyor :) –

+0

Hata ayıklama amaçları için harika bir numara – ganqqwerty

8

Bu aynı zamanda benim için çalışıyor.

app.controller('navigation', function($scope, $route) { 
    $scope.tab = function(route) { 
    return $route.current && route === $route.current.controller; 
    } 
} 

Sonra bu gibi kullanabilirsiniz:

<div ng-controller="navigation" class="container"> 
    <ul class="nav nav-pills" role="tablist"> 
     <li ng-class="{active:tab('home')}"><a href='#/'>home</a></li> 
     <li ng-class="{active:tab('dashboard')}"><a href='#/dashboard'>dashboard</a></li> 
    </ul> 
</div> 
bir denetleyici seçmek için 'ngRoute' kullanırken kontrolör adı verilen bir rotayı eşleşti eğer belirlemek için bir işlev ihtiyacı vardı, bu yüzden bunu

Zaten yapılandırmam için yollar ekledim, örn.

angular.module('app', [ 'ngRoute' ]).config(
    function($routeProvider) { 

     $routeProvider.otherwise('/'); 
     $routeProvider.when('/', { 
      templateUrl : 'home.html', 
      controller : 'home' 
     }).when('/dashboard', { 
      templateUrl : 'dashboard.html', 
      controller : 'dashboard' 
     }); 

    }) 
2

soru gibi bir şey biraz eskidi ama hala bazılarınız için yararlı olabilir ... Ben kontrolör adını ama sadece Controller as sözdizimi ile çalışır almak için bir yol buldu. Şimdi denetleyicimin adını her seferinde el ile yeniden yazmak zorunda kalmadan günlüğe kaydetmeyi daha kolay yapabilirim.

// scope element via the DOM 
var scope = angular.element($(element)).scope();  
console.log(scope.this.vm.constructor.name); 

// controller element via the DOM 
var controller = angular.element($(element)).controller();  
console.log(controller.constructor.name); 


Edit
Ayrıca çalıştı
:

// a simple route with controller as syntax 
$routeProvider.when(
    '/contact', 
    { 
     templateUrl: 'home/contact', 
     controller: 'ContactController as vm' 
    } 
); 

// controller 
app.controller("ContactController", ["$log", function ContactController($log) { 
    var vm = this; 
    $log.log(vm.constructor.name); 
}]); 

sen (javascript eski kod) DOM yapmak istiyorsanız, bu şekilde yapmak da olabilir: İşte bir örnek aslında örneğin $scope çalışır o Dave Syer öneri:

app.controller("ContactController", ['$route', function ContactController($route) { 
    console.log($route.current.controller); 
}]); 
+1

Bu harika! Büyük bir proje üzerinde çalışıyorum ve sayfadaki belirli bir öğeye bakmak için hangi denetleyiciye bakmam gerektiğini bulmak çok kolay ve 'angular.element ($ 0) .controller(). Constructor.name' konsolda. –

11

Yani, esas o n Kevin Håkanson gelen cevap ve Darkthread gelen yorum, bu kod en az 1.3.15 çalışır: sadece $ attrs hizmet deneyin kontrolör fabrika fonksiyonunda

app.config(['$provide', function ($provide) { 
    $provide.decorator('$controller', ['$delegate', function ($delegate) { 
     return function (constructor, locals, later, indent) { 
      if (typeof constructor === 'string' && !locals.$scope.controllerName) { 
       locals.$scope.controllerName = constructor; 
      } 
      return $delegate(constructor, locals, later, indent); 
     }; 
    }]) 
}]); 
+0

, eğer uygulamanızı küçültürseniz işe yaramıyor, küçültülmüş bir dosyada bile argümanların isimlerini nasıl sağlıyorsunuz? –

+0

Benim durumumda, başvurumu dağıtmak için gulp kullanıyorum. Bu yüzden bu sorunu kullanarak https://www.npmjs.com/package/gulp-ng-annotate –

+1

minifikize izin veren bir düzenleme gönderdi. – coder

5

dev

app.controller("MyController", ["$attrs", function($attrs){ 

     var currentControllerName = $attrs["ngController"]; 

}]); 
2

sadece this.constructor.name herhangi bir yerde bu sınıfın kapsamı bir kez kullanıma hazır.

İlgili konular