2014-09-19 10 views
8

Mam kilka kontrolerów z pewnym wspólnym kodem, w szczególności z $scope.$watch, który jest identyczny dla kilku kontrolerów. Jak mogę umieścić ten kod w osobnym pliku i zaimportować wspólny kod w różnych kontrolerach, które tego wymagają: $watch?Kontrolery AngularJS: Przenieś wspólny kod do oddzielnego pliku

+0

Czy serwis mógłby za to służyć? – worldask

+0

Jestem prawie pewien, że zakres w usłudze nie jest możliwy ... – EricC

+0

@EricC $ scope będzie po prostu parametrem funkcji usługi. – cgTag

Odpowiedz

7

Ty mógłby skorzystać z usługi, przekazując w zakresie swojego kontrolera:

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); 
}]); 

ten sposób używasz zakresu indywidualnego kontrolera, lecz za pomocą wspólnej metody wewnątrz usługi. Możesz również użyć angular.extend($scope, AService) w kontrolerze, jeśli chcesz mieć wspólną funkcjonalność usługi faktycznie dodanej do kontrolerów.

Oto pracuje Fiddle: http://jsfiddle.net/rhcjdb7L/

pewien, że to bardzo fajny i wszystko, ale na pewno nie chcesz używać $rootscope.$broadcast()? Jest to całkiem dobrze napisane: http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

+0

Nie widzę sensu rozszerzania zakresu $. Masz już usługę. Po prostu wywołaj 'CommonFunctions.init ($ scope)' – cgTag

+0

Masz rację, 'extend()' jest przesadą w tym przypadku, ponieważ nie potrzebujesz tej funkcji w $ scope z jakiegokolwiek powodu. Zrewidowałem swoją odpowiedź. –

+0

Dziękuję wam :) – EricC

Powiązane problemy