TypeError:$ controller不是控制器内部的函数+控制器

时间:2016-04-11 16:06:42

标签: javascript angularjs dependency-injection angularjs-scope angularjs-controller

我是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对象,它设置范围变量中的值。

3 个答案:

答案 0 :(得分:2)

问题在于TransportController的依赖性内联数组,其中大多数依赖项都被错过注入DI数组,因此在控制器工厂函数中未定义的是受尊重的实例。

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

应该是

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

理想情况下,您不应将一个控制器插入另一个控制器。您可以使用service/factory来共享应用程序所有组件中最长的数据。

答案 1 :(得分:1)

将控制器插入另一个控制器是没有意义的。对于常见功能,最好使用服务。

答案 2 :(得分:0)

如果需要在子视图中引用父控制器,子视图需要[使用指令](https://docs.angularjs.org/guide/directive),然后需要父控制器。

  

当指令需要控制器时,它接收该控制器作为其链接函数的第四个参数。

如果您需要从子控制器获取对父级的引用,则子级可以将其作为对象添加到$ scope或controller中。

IME实际上需要做其中任何一件事是非常罕见的。通常,如果您再考虑问题,您可以找到一种不同的方法来处理它。