2014-09-19 16 views
8

Bazı ortak denetimlere sahip bazı denetleyicilere sahibim, özellikle birkaç denetleyici için aynı olan bir $scope.$watch. Bu kodu ayrı bir dosyaya nasıl koyabilirim ve bu $watch'un gereksinim duyduğu çeşitli denetleyicilerindeki ortak kodu içe aktarabilir miyim?AngularJS denetleyicileri: Dosyayı ayırmak için ortak kodu taşıyın

+0

bunun için çalışabilir mi? – worldask

+0

Bir hizmet kapsamının mümkün olmadığından eminim ... – EricC

+0

@EricC $ kapsamı, yalnızca bir hizmet işlevi için bir parametre olabilir. – cgTag

cevap

7

Sen senin kontrolörün kapsamında geçirerek bir hizmeti kullanabilirsiniz:

angular.module('app').service("CommonFunctions", ['SomeService', function(SomeService) { 
    var commonFunctions = {}; 
    commonFunctions.init = function(scope){ 
     scope.$watch(function(){},function(){}) 
    }; 
    return commonFunctions; 
}]); 

angular.module('app').controller('Ctrl1', 
['$scope','CommonFunctions',function($scope,CommonFunctions) { 
    CommonFunctions.init($scope); 
}]); 

angular.module('app').controller('Ctrl2', 
['$scope','CommonFunctions',function($scope,CommonFunctions) { 
    CommonFunctions.init($scope); 
}]); 

Bu şekilde tek tek kontrolörün kapsamı kullanarak, ancak bir hizmet içinde ortak bir yöntem kullanıyoruz. Denetleyici kapsamlarına gerçekten eklenen bir hizmetten genel işlev istiyorsanız, bir denetleyicide angular.extend($scope, AService)'u da kullanabilirsiniz. İşte

çalışan Fiddle var: http://jsfiddle.net/rhcjdb7L/

Tabii çok serin ve tüm, ama $rootscope.$broadcast() kullanmak istemediğine emin misin? Bu oldukça iyi yazılmış: http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

+0

$ kapsamını genişletme noktasını göremiyorum. Zaten bir servisin var. Sadece 'CommonFunctions.init ($ kapsamı)' olarak adlandırın – cgTag

+0

Haklısınız, 'extend()' bu durumda overkill çünkü herhangi bir nedenle $ kapsamı içinde bu işleve ihtiyacınız yok. Cevabımı değiştirdim. –

+0

Teşekkürler çocuklar :) – EricC

İlgili konular