18

John Lindquist の多くのビデオに示されているように、ルートを変更する前にアプリにデータを収集させようとしています: 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 リソースが移動して戻ってきて、実際の「deferred.resolve(data);」まですべてが機能します。これは、上に貼り付けられたエラーが表示される場所です。その1行をコメントアウトすると、もちろんページは表示されませんが、エラーも表示されません。

DBFactory から返されるデータの内容は JSON オブジェクトであり、これは予期されたものであり、私がオンラインで見たすべての例とビデオに示されています。

使用:

AngularJS 1.0.6

考え?ご助力いただきありがとうございます。

アップデート:

ルートを使用し、名前空間でコントローラーを定義していた方法のようです:

var Dashboard = angular.module( 'saApp' ).controller()

これのせいでした。標準の関数宣言を使用するだけの場合:

function DashboardCtrl($scope, dataset) {
  $scope.data = dataset;
}

「関数を探して、オブジェクトを取得しました」というエラーを満たします。奇妙なことは、それをオブジェクト「var DashboardCtrl = angular.module('saApp').controller()」として使用するように変更したこと、または以前に持っていたものをyeomanジェネレーターから使用するように変更し、angularjsドキュメントで指定したことですの:

angular.module( 'saApp' )
.controller( 'DashboardCtrl', function ( $scope, dataset ) {});

次のルートで:

.when( '/dashboard', {
            templateUrl: 'views/dashboard/dashboard.html',
            controller: 'DashboardCtrl'
        } )

うまくいきません。

4

10 に答える 10

8

私はこのエラーを何度も経験しましたが、最終的に完璧でシンプルな解決策を見つけました. 次のように、コントローラー名を「when」構造に引用符で囲みます。

.when( '/dashboard', {
    templateUrl: 'views/dashboard/dashboard.html',
    controller: 'Dashboard',
    resolve: Dashboard.resolve
}

それ以外の

.when( '/dashboard', {
    templateUrl: 'views/dashboard/dashboard.html',
    controller: Dashboard,
    resolve: Dashboard.resolve
}
于 2013-12-26T22:16:45.747 に答える
4

これにより、コントローラー オブジェクトが返されます。

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})
于 2013-05-23T04:53:38.487 に答える
4

ファクトリにリンクするときに誤って余分な括弧を含めた場合にも発生します。

悪い:

myModule.factory('monkey', ['$http', MonkeyFactory()]);

良い:

myModule.factory('monkey', ['$http', MonkeyFactory]);
于 2014-11-07T20:31:57.013 に答える
2

Coffeescript で Karma を使用してモジュールのモックを作成しているときに、このエラーが発生しました。

解決策は、($provide)-> 関数の最後に「return null」を追加することでした。それがなければ、coffeescript は $provide.value() の結果を返します。これはオブジェクトだと思いますが、これはどういうわけか「'fn は関数ではありません」を引き起こします。

例:

module 'myModule', ($provide)->
  $provide.value 'myInjectable',
    myFunction:-> return "dummy value"
  return null # prevents "fn is not a function"
于 2015-11-09T13:50:07.740 に答える