13

È possibile iniettare un controller in un altro controller che si trova a parte lo stesso modulo?AngularJS: inserire il controller all'interno di un altro controller dallo stesso modulo

esempio:

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

Continuo a ricevere sconosciuto fornitore sul controllerOne. Non vedo come sia possibile dal momento che coesistono nello stesso modulo. Qualsiasi aiuto sarebbe molto apprezzato.

+0

possibile duplicato di [Can una chiamata controllore all'altro?] (http://stackoverflow.com/questions/9293423/can-one-controller-call-another) –

+0

Nel mio numero, i miei controller si trovano nello stesso modulo e sono scritti in formato puramente angularjs. Il post che hai fornito non era, sono un dilettante e non ho davvero capito nulla nell'altro post. Grazie per il suggerimento però :) –

+0

Grazie per tutti i suggerimenti !!! Avete tutti ragione, trasferirò la logica condivisa in una fabbrica, è solo più facile e meno mal di testa lol. –

risposta

21

è necessario utilizzare $controller dipendenza utilizzando che si può iniettare un controllore all'altro

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

Ma preferiscono service/factory di condividere i dati

+0

Questa è un'ottima soluzione, ma come mai non è buono come utilizzare un servizio/fabbrica per condividere i dati? Cosa succede se voglio solo utilizzare una funzione in controllerOne? Non posso usare $ controller per quello? – gerl

+7

"Ma preferisci servizio/fabbrica per condividere i dati". Sì! Sì! Sì! – Rap

+0

Puoi dare un esempio su come chiamare una funzione in un altro controller dopo aver iniettato –

3

Spostare la logica in un "servizio" (una fabbrica/servizio/fornitore). Personalmente preferisco le fabbriche, mi piace controllare il mio oggetto invece di usare this o qualcosa del genere con le altre opzioni.

Utilizzando un servizio, ti dai la possibilità di astrarre la logica aziendale dai tuoi controller e di rendere quella logica - riutilizzabile -!

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

Avviso sharedService viene iniettato

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

Nota a margine: controllori devono essere capitalizzati per mostrare il loro significato!

La potenza dei servizi :)

1

Se l'una controllerTwo ha bisogno di chiamare la stessa funzione controllerOne, si consiglia di creare un servizio per gestire la cosa. Angular Services - sono accessibili in tutto il programma tramite l'iniezione delle dipendenze.

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

Spero che questo aiuti!

0

Non si può iniettare i controller in un altro controller, solo serviceProviers sono iniettabili. Questo è il motivo per cui si sta verificando un errore come provider sconosciuto nel controller uno.

Utilizzare invece i Servizi e iniettarli nei controller, se è disponibile una funzionalità da condividere tra i controller. I servizi sono il modo migliore per condividere i dati tra i controller.

È possibile dichiarare una variabile o funzione o dire oggetto su $ rootScope, è presente nell'intera applicazione.

Share data between AngularJS controllers

+0

utilizzando $ rootScope è considerato come pattern errato in angularjs –

+0

Sì, è una cattiva pratica usare $ rootScope, ho menzionato come è una delle opzioni per essere usato. – Ritesh

+0

Non dovresti mai usare '$ rootScope', ecco perché sto dicendo che tu $ suggerimento rootScope non appropriato –

Problemi correlati