2013-05-22 2 views
1

Я получаю эту ошибку Error: Argument 'readingController' is not a function, got undefined. и ничего не отображается на странице. Что я сделал не так?Угловая настройка маршрутизации дает ошибку «не является функцией»

var app = angular.module('Tutorials', ['functions', 'ui.utils', 'tutorials']).controller('main', function($scope, $element, Position, Romanize) { 
$scope.sectionNumber = Position.sectionNumber; 
$scope.tutorialNumber = Position.tutorialNumber; 
$scope.questionNumber = Position.questionNumber; 
$scope.sections = sections; 
$scope.currentMaterials = [] 
    $scope.currentMaterial = ""; 

var readingController = function($scope, Romanize) { 
    $scope.currentMaterials = $scope.sections[$scope.sectionNumber].tutorials[$scope.tutorialNumber].material; 
    $scope.currentMaterial = $scope.currentMaterials[$scope.questionNumber]; 
    $scope.getRomanization = function(Romanize) { 
     Romanize.get($scope.currentMaterial).then(function(d) { 
      $scope.romanized = d; 
     }); 

     $scope.$apply(); 
    }; 
    $scope.getRomanization(Romanize); 
    $scope.$apply(); 

    $scope.checkRomanization = function(userRomanization) { 
     if ($scope.romanized === userRomanization) { 
      $scope.questionNumber++; 
      $scope.getRomanization(Romanize); 
     }; 
    } 
}; 

$scope.loadFromMenu(0, 0, true); 

}).config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { 
$routeProvider.when('/grammar/Reading/Basic Vowels', { 
    templateUrl: '/grammar/Templates/Reading.html', 
    controller: 'readingController' 
}).when('/test/secondTab', { 
    templateUrl: '/js/test/angular/views/secondTab.html', 
    controller: 'SecondTabCtrl' 
}).otherwise({ 
    redirectTo: '/' 
}); 

$locationProvider.html5Mode(true); 
}]); 
+0

Try объявить контроллеры с помощью '.controller («имени», функции() {})' на вашем модуле – Ven

+0

Есть некоторые синтаксические ошибки со слишком большим количеством фигурных скобок. Кроме того, 'readController' определяется внутри другого контроллера и не является допустимым угловым контроллером. Я бы предложил очистить синтаксис и отступы и перейти оттуда. – sh0ber

+0

Я думаю, что это просто скопировать ошибки, поскольку это сокращено от исходного кода. – Tules

ответ

0

Угловой внешний вид контроллеров, которые определены внутри углового модуля.

Вы определили функцию контроллера, но вы должны сказать Угловая об этом:

app.controller('readingController', readingController) 

Или, как один из комментариев к вашему вопросу предлагает, просто определить функцию контроллера внутри вызова controller:

app.controller('readingController', function($scope, Romanize) { 
    // controller stuff 
}); 
+0

Проблема заключается в том, что контроллеру чтения (и всем другим отдельным контроллерам) необходимо получить доступ к данным от основного контроллера, который они объявили внутри. Это, по сути, данные состояния пользователя и должны быть доступны во всем приложении. Я следовал структуре, предложенной этим сообщением https://github.com/mgonto/specs/wiki/Angular's-project-structure, но, возможно, я неправильно понял. – Tules

+1

Во-первых, я не уверен, что описанный там подход - это все, что было здорово (хотя я просто просмотрел его), но вы не понимаете, что подразумевается под «одним контроллером внутри другого». Он означает объявление в html: '

', НЕ в JS. Созданная для контроллера 'InsideMain'' $ scope 'будет прототипически унаследована из '$ scope'' Main'. Контроллеры по-прежнему должны быть объявлены как обычные на угловом модуле. – satchmorun

1

Вот другой пример организации контроллеров (или что-нибудь еще для вашего приложения):

angular.module('MyApp', []) 

.config(['$routeProvider', function ($routeProvider) { 
    $routeProvider 
    .when('/', { controller: 'MainCtrl' }) 
    .when('/first-page', { controller: 'FirstCtrl' }) 
    .when('/second-page', { controller: 'SecondCtrl' }); 
}]) 

.controller('MainCtrl', ['$rootScope', '$scope', function ($rootScope, $scope) { 
    // ... 
}]) 

.controller('FirstCtrl', ['$scope', function ($scope) { 
    // ... 
}]) 

.controller('SecondCtrl', ['$scope', '$http', function ($scope, $http) { 
    // ... 
}]); 

Или, может быть, в собственном файле, например. foobar.js

angular.module('MyApp').controller('FoobarCtrl', ['$scope', function ($scope) { 
    // ... 
}]); 
Смежные вопросы