0

Angular JSの新機能で、別のコントローラー内のコントローラーを呼び出そうとしましたが、エラーが発生しました。

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) 

ここに何か不足していますか?

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

これは別のコントローラにコントローラを挿入する最も良い方法ですか? 私はすべてのコントローラーの種類のユーティリティーメソッドで共有したい共通メソッドを持っていますが、サービスを呼び出し、promiseオブジェクトを使用してスコープ変数に値を設定します。

答えて

1

コントローラを別のコントローラに挿入することは意味がありません。一般的な機能については、サービスを使用する方がよいでしょう。

+0

ありがとうございました、あなたの提案に従ってリファクタリングしてください。 –

2

DIアレイに注入するためにほとんどの依存関係が欠けているTransportControllerの依存関係インライン配列が問題です。そのため、重要なインスタンスはコントローラファクトリ関数内では未定義です。

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

は、あなたが理想的に別のコントローラに1つのコントローラを挿入してはならない

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

でなければなりません。 service/factoryを使用して、アプリケーションのすべてのコンポーネント間でデータを共有できます。

+0

ありがとう.. –

0

子ビュー内の親コントローラを参照する必要がある場合、子ビューは[指示を使用する](https://docs.angularjs.org/guide/directive)必要があり、親コントローラが必要です。

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

あなたが親に子コントローラからの参照を取得する必要がある場合は、子供がちょうどオブジェクトとして$スコープまたはコントローラに追加することができます。

IME実際にこれらのことを行う必要はほとんどありません。問題をもう少し長く考えてみると、別の方法でそれにアプローチすることができます。

関連する問題