AngularJS defer error: Аргумент 'fn' не является функцией, получен Object - программирование
Подтвердить что ты не робот

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

не будет работать.

4b9b3361

Ответ 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, которая не определена в контроллере.