0

Ich bin neu in Angular JS und versuche, einen Controller in einem anderen Controller aufzurufen, aber unter Fehler zu kommen.

ionic.bundle.js:21157 TypeError: $controller is not a function 
at new <anonymous> (http://localhost:8080/itravel/www/js/controllers.js:6:2) 
at invoke (http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:13277:17) 
at Object.instantiate (http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:13285:27) 
at http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:17841:28 
at self.appendViewElement (http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:52255:24) 
at Object.switcher.render (http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:50449:41) 
at Object.switcher.init (http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:50369:20) 
at self.render (http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:52115:14) 
at self.register (http://localhost:8080/itravel/www/lib/ionic/js/ionic.bundle.js:52073:10) 

Fehlt mir hier etwas?

angular.module('starter.controllers', []).controller('DashCtrl', function($scope) { 

}).controller('TransportController',['$scope','$controller', function($scope, TrainService, $ionicModal, $window, $controller) { 
console.log("TransportController"); 

$controller('ProfileController', { 
    $scope: $scope 
}) 

//$scope.testFunction(); 

$scope.transports = [];//TrainService.all(); 
$ionicModal.fromTemplateUrl('templates/modal.html', { 
    scope: $scope 
}).then(function(modal) { 
    if (angular.equals(typeof $window.localStorage['profile'],'undefined')) { 
     modal.show(); 
    } else { 
     $scope.profile = JSON.parse($window.localStorage['profile']); 
     if (angular.equals($scope.profile.city,'undefined') || angular.equals($scope.profile.city,'')) { 
      modal.show(); 
     } 
    } 
    $scope.modal = modal; 
}); 

$scope.saveUserProfile = function() { 
    console.log("Saving User Profile"); 
    console.log($scope.profile); 
    $window.localStorage['profile'] = JSON.stringify($scope.profile); 
    $scope.modal.hide(); 
} 

}]).controller('ProfileController', function($scope, $window, $ionicModal,   TrainService, $ionicHistory,$timeout) { 

if (!angular.equals($window.localStorage['profile'],'undefined')) { 
    $scope.profile = JSON.parse($window.localStorage['profile']); 
} 

$scope.selectedCity = "MUMBAI"; 

var promise = TrainService.listCities(); 
promise.then(function(resp){ 
    $scope.cities = resp.data; 
}) 

Ist dies der beste Weg, um Controller in einen anderen Controller einzufügen? Ich habe nur eine gemeinsame Methode, die ich über alle Controller Art von Utility-Methode teilen möchte, aber es ruft Service und Verwendung von Versprechen Objekt legt den Wert in Scope-Variable.

Antwort

1

Es macht keinen Sinn, einen Controller in einen anderen Controller einzufügen. Für allgemeine Funktionen ist es besser, einen Dienst zu verwenden.

+0

Danke, Refaktoriert nach Ihrem Vorschlag. –

2

Problem ist mit Abhängigkeit Inline-Array von TransportController, wo die meisten Abhängigkeit zu injizieren in DI-Array verpasst, so dass die respektierten Instanzen undefined innerhalb der Controller Factory-Funktion sind.

.controller('TransportController',['$scope','$controller', function($scope, TrainService, $ionicModal, $window, 

sollte

sein
.controller('TransportController',['$scope','$controller', 'TrainService', '$ionicModal', '$window', 
    function($scope, $controller, TrainService, $ionicModal, $window, 

Sie sollten nicht in idealer Weise einen Controller in einen anderen Controller einsetzen. Sie können service/factory verwenden, um Daten am längsten mit allen Komponenten Ihrer Anwendung zu teilen.

+0

hab es dank .. –

0

Wenn Sie in einer untergeordneten Ansicht auf einen übergeordneten Controller verweisen müssen, muss die untergeordnete Ansicht [eine Anweisung verwenden] (https://docs.angularjs.org/guide/directive) und dann den übergeordneten Controller erfordern.

When a directive requires a controller, it receives that controller as the fourth argument of its link function.

Wenn Sie einen Verweis von einem Kind Controller in die Mutter bekommen müssen, kann das Kind nur fügen Sie es den $ scope oder Controller als Objekt.

IME es ist sehr selten, tatsächlich eines dieser Dinge zu tun. Oft, wenn Sie das Problem ein wenig länger betrachten, können Sie einen anderen Weg finden, es zu nähern.