13

Czy można wprowadzić kontroler do innego kontrolera, który jest poza tym samym modułem?AngularJS: Wprowadzić kontroler wewnątrz innego kontrolera z tego samego modułu.

przykład:

var app = angular.module('myAppModule', []) 
 
.controller('controllerOne', ['$scope'. function($scope){ 
 
    $scope.helloWorld = function(){ 
 
    return 'Hello World'; 
 
    } 
 
}]) 
 
.controller('controllerTwo', ['$scope', 'controllerOne', function($scope, controllerOne){ 
 
    console.log(controllerOne.helloWorld()); 
 
}])

Wciąż dostaję nieznanego dostawcy na controllerOne. Nie widzę, jak to jest możliwe, ponieważ współistnieją w tym samym module. Każda pomoc byłaby bardzo cenna.

+0

możliwe duplikat [można nazwać innego kontrolera?] (http://stackoverflow.com/questions/9293423/can-one-controller-call-another) –

+0

W moim wydaniu moje kontrolery znajdują się w tym samym module i zapisane w formacie czysto angularjs. Podany przez Ciebie wpis nie był, jestem amatorem i naprawdę nie rozumiem niczego w drugim poście. Dziękujemy za sugestię :) –

+0

Dzięki za wszelkie sugestie !!! Wszyscy macie rację, wprowadzę wspólną logikę do fabryki, po prostu łatwiej i mniej lol. –

Odpowiedz

21

Trzeba użyć $controller zależność za pomocą których można wstrzykiwać jeden kontroler do innego

.controller('controllerTwo', ['$scope', '$controller', function($scope, $controller){ 
    $controller('controllerOne', {$scope: $scope}) 
    //inside scope you the controllerOne scope will available 
}]); 

Ale czy wolą service/factory udostępniać dane

+0

To świetne rozwiązanie, ale jak to nie jest tak dobre, jak używanie usługi/fabryki do udostępniania danych? Co jeśli chcę po prostu użyć funkcji w ControllerOne? Nie mogę użyć do tego kontrolera $? – gerl

+7

"Ale wolę usługę/fabrykę w celu udostępniania danych". Tak! Tak! Tak! – Rap

+0

Czy możesz podać przykład, jak wywołać funkcję w innym kontrolerze po wstrzyknięciu –

3

Przenieś swoją logikę do "usługi" (fabryki/usługodawcy/dostawcy). Osobiście wolę fabryki, po prostu lubię kontrolować własny obiekt zamiast używać this lub czegoś podobnego z innymi opcjami.

Korzystając z usługi, dajesz sobie możliwość abstrakcji logiki biznesowej od kontrolerów, i spraw, aby ta logika - wielokrotnego użytku -!

var app = angular.module('myAppModule', []) 

// typically people use the word Service at the end of the name 
// even if it's a factory (it's all the same thing really... 

.factory('sharedService', function() { 

    var methods = {}; 

    methods.helloWorld = function() { 
     return 'Hello World!'; 
    }; 

    // whatever methods/properties you have within this methods object 
    // will be available to be called anywhere sharedService is injected. 

    return methods; 
}) 

Wskazówka sharedService wstrzykuje

.controller('ControllerOne', ['$scope', 'sharedService', function($scope, sharedService) { 
    $scope.helloWorld = sharedService.helloWorld(); 
}]) 

// Notice sharedService is injected here as well 
.controller('ControllerTwo', ['$scope', 'sharedService', function($scope, sharedService){ 

    // Now we can access it here too! 
    console.log(sharedService.helloWorld()); 
}]); 

marginesie: Sterowniki powinny być kapitalizowane, aby pokazać ich znaczenie!

Moc usług :)

1

Jeśli wartość controllerTwo musi wywołać tę samą funkcję co controllerOne, można stworzyć usługę go obsłużyć. Angular Services - są one dostępne w całym programie za pośrednictwem wstrzyknięcia zależności.

var app = angular.module('myAppModule', []) 
.controller('controllerOne', ['$scope', 'Hello', function($scope, Hello){ 
    console.log(Hello.helloWorld() + ' controller one'); 
}]) 
.controller('controllerTwo', ['$scope', 'Hello', function($scope, Hello){ 
    console.log(Hello.helloWorld() + ' controller two'); 
}]) 
.factory('Hello', [function() { 
    var data = { 
     'helloWorld': function() { 
      return 'Hello World'; 
     } 
    } 

    return data; 
}]); 

Mam nadzieję, że to pomoże!

0

Nie można wstrzykiwać kontrolerów w kolejnych kontrolerów, tylko serviceProvierswstrzykiwania. Z tego powodu otrzymujesz błąd jako nie znany dostawca w kontrolerze.

Zamiast tego należy użyć usług i wprowadzić je do kontrolerów, jeśli istnieje kilka funkcji, które mogą być współużytkowane przez kontrolery. Serwisy są najlepszym sposobem udostępniania danych między kontrolerami.

Możesz zadeklarować zmienną lub funkcję lub powiedzieć obiekt na $ rootScope, istnieje on w całej aplikacji.

Share data between AngularJS controllers

+0

używanie $ rootScope jest uznawane za zły wzorzec w angularjs –

+0

Tak, niewłaściwą praktyką jest używanie $ rootScope, wspomniałem o tym, ponieważ jest to jedna z opcji być użytym. – Ritesh

+0

Nigdy nie powinieneś używać '$ rootScope', dlatego mówię, że Twoja sugestia $ rootScope nie jest odpowiednia –

Powiązane problemy