AngularJS defer error: Аргумент 'fn' не является функцией, получен Object
Я пытаюсь заставить свое приложение собирать данные перед изменением маршрута, как показано на многих видео от Джона Линдквиста: http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcp
У меня все подключено, но когда это время для отложенного объекта для решения, я получаю сообщение об ошибке:
Error: Argument 'fn' is not a function, got Object
at assertArg (http://localhost:9000/components/angular/angular.js:1019:11)
at assertArgFn (http://localhost:9000/components/angular/angular.js:1029:3)
at annotate (http://localhost:9000/components/angular/angular.js:2350:5)
at invoke (http://localhost:9000/components/angular/angular.js:2833:21)
at Object.instantiate (http://localhost:9000/components/angular/angular.js:2874:23)
at http://localhost:9000/components/angular/angular.js:4759:24
at <error: illegal access>
at Object.Scope.$broadcast (http://localhost:9000/components/angular/angular.js:8261:28)
at http://localhost:9000/components/angular/angular.js:7417:26
at wrappedCallback (http://localhost:9000/components/angular/angular.js:6797:59) angular.js:5704
Мой код выглядит следующим образом:
Маршрут -
angular.module( 'saApp' )
.config( function ( $routeProvider, $locationProvider ) {
$routeProvider
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: Dashboard,
resolve: Dashboard.resolve
}
});
-
var Dashboard = angular.module( 'saApp' ).controller(
function ( $scope, dataset ) {
$scope.data = dataset;
} );
Dashboard.resolve = {
dataset: function ( $q, DBFactory ) {
console.log("dataset enter")
var deferred = $q.defer();
DBFactory.get( {noun: "dashboard"},
function ( data ) {
console.log("resolving");
deferred.resolve( data );
} );
console.log("promise");
return deferred.promise;
}
}
При запуске он выполняет это решение, возвращается ресурс DBFactory, и все работает до фактического "отложенного" (данные); где я получаю ошибку, вставленную выше. Если я прокомментирую, что одна строка, конечно, я не получаю ни одной страницы, но я также не получаю ошибки.
Содержимое данных, возвращаемое из DBFactory, представляет собой объект JSON, который является тем, что ожидается, и показан во всех примерах, которые я видел в Интернете и видео.
с помощью:
AngularJS 1.0.6
Мысли? Спасибо за вашу помощь.
UPDATE:
Кажется, что я использовал свои маршруты и определял контроллер с пространством имен:
var Dashboard = angular.module( 'saApp' ).controller()
был виноват в этом. Когда я просто использую объявление стандартной функции:
function DashboardCtrl($scope, dataset) {
$scope.data = dataset;
}
он удовлетворяет ошибке "поиск функции, полученного объекта". Странным было то, что я изменил его использование в качестве объекта "var DashboardCtrl = angular.module(" saApp "). Controller()" или даже то, что у меня было до этого от генератора йома, и указано в angularjs docs:
angular.module( 'saApp' )
.controller( 'DashboardCtrl', function ( $scope, dataset ) {});
с маршрутом:
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'DashboardCtrl'
} )
не будет работать.
Ответы
Ответ 1
У меня была эта ошибка много раз и, наконец, нашел идеальное и простое решение. Просто поместите свое имя контроллера в конструкцию "когда" в кавычки следующим образом:
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'Dashboard',
resolve: Dashboard.resolve
}
вместо
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: Dashboard,
resolve: Dashboard.resolve
}
Ответ 2
Возвращает объект контроллера:
var myCtrl = myApp.controller('whatever'...
Но маршрут требует фактической функции контроллера. Поэтому... предполагая, что это ваш контроллер и разрешаем: (обратите внимание, что я назвал контроллер "IndexCtrl"... я не думаю, что вы делали это в своем коде)
myApp = angular.module('myApp')
var IndexCtrl = myApp.controller('IndexCtrl', function($scope){
.. blah blah...
})
IndexCtrl.resolve = {
loadData:function(){ ... blah blah... }
}
Вы можете angular найти контроллер, передав имя. (обратите внимание, что ссылка на контроллер - это строка)
.when('/',{controller:'IndexCtrl', resolve:IndexCtrl.resolve})
Ответ 3
Также произойдет, если вы случайно включите дополнительные круглые скобки, когда вы связываетесь в factory:
ПЛОХО:
myModule.factory('monkey', ['$http', MonkeyFactory()]);
ХОРОШО:
myModule.factory('monkey', ['$http', MonkeyFactory]);
Ответ 4
У меня была такая же проблема. Вы можете решить эту проблему, выполнив следующие действия.
Удалить декларацию контроллера из маршрутов .when()
метод. Итак, это...
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: Dashboard,
resolve: Dashboard.resolve
}
становится именно этим...
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
resolve: Dashboard.resolve
}
Теперь, чтобы сохранить свою область действия, добавьте объявление контроллера в свой шаблон html. Например..
<div ng-controller="DashboardCtrl">{{Some fancy dashboard stuff}}</div>
Ответ 5
Или если вы по ошибке сделали инъекцию после имени factory/controller, как это (неправильный путь);
angular.module('MyModule')
.factory('MyFactory', 'AnotherFactory', ['$http', function($http, AnotherFactory){
// CODE HERE
}]);
Правильный путь;
angular.module('MyModule')
.factory('MyFactory', ['$http', 'AnotherFactory', function($http, AnotherFactory){
// CODE HERE
}]);
Ответ 6
Я получил эту ошибку, выполняя модульное издевательство над кармой в Coffeescript.
Решение заключалось в том, чтобы добавить "return null" в конец функции ($ обеспечить) → . Без этого coffeescript вернет результат $provision.value(), который, я думаю, является объектом, который каким-то образом вызывает "fn не является функцией".
Пример:
module 'myModule', ($provide)->
$provide.value 'myInjectable',
myFunction:-> return "dummy value"
return null # prevents "fn is not a function"
Ответ 7
Мне удалось решить эту проблему: "fn не является функцией, полученным объектом", импортируя мою "функцию" из другого файла, добавив {} следующим образом:
import {MenuCtrl} from './controllers/MenuCtrl.js';
Старый способ:
import MenuCtrl from './controllers/MenuCtrl.js';
Ссылка на эту проблему: https://github.com/swimlane/angular-data-table/issues/189
Ответ 8
Это также произойдет, если вы используете Coffescript + angularjs.
Так как angularjs поддерживает классы Coffescript.
class IndexCtrl
constructor: () ->
myApp.controller('IndexCtrl',IndexCtrl)
то в
.when()
"controller: IndexCtrl" видит объект, а не функцию.
Ответ 9
Мы также получаем эту ошибку, когда у нас есть функция в html, которая не определена в контроллере.