2013-04-22 26 views
14

Tôi đang cố gắng để làm cho ứng dụng của tôi thu thập các dữ liệu trước khi thay đổi tuyến đường, như thể hiện trên nhiều video từ John Lindquist: http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcpAngularJS hoãn lỗi: Đối số 'fn' không phải là một chức năng, có Object

tôi đều nó nối, nhưng khi đó là thời gian cho đối tượng thu nhập hoãn lại để giải quyết, tôi nhận được lỗi:

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 

mã của tôi trông như thế này:

Route -

angular.module('saApp') 
.config(function ($routeProvider, $locationProvider) { 
    $routeProvider 
     .when('/dashboard', { 
      templateUrl: 'views/dashboard/dashboard.html', 
      controller: Dashboard, 
      resolve: Dashboard.resolve 
     } 
}); 

điều khiển -

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; 
    } 
} 

On chạy, nó thực hiện quyết tâm, tài nguyên DBFactory đi, trở lại và mọi thứ hoạt động cho đến khi thực tế "deferred.resolve (dữ liệu);" đó là nơi mà sau đó tôi nhận được lỗi dán ở trên. Nếu tôi bình luận rằng một dòng ra, tất nhiên tôi không có trang, nhưng tôi cũng không nhận được lỗi.

Nội dung của dữ liệu, quay lại từ DBFactory là một đối tượng JSON, đó là những gì được mong đợi và được hiển thị trong tất cả các ví dụ tôi đã xem trực tuyến và video.

sử dụng:

AngularJS 1.0.6 

Suy nghĩ? Cảm ơn tất cả sự giúp đỡ của bạn.

UPDATE:

Có vẻ như con đường tôi đã sử dụng các tuyến đường của tôi và xác định bộ điều khiển với không gian tên:

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

là để đổ lỗi cho việc này. Khi tôi chỉ cần sử dụng khai báo hàm chuẩn:

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

đáp ứng lỗi "tìm kiếm hàm, nhận đối tượng". Điều kỳ lạ là tôi đã thay đổi để sử dụng nó như là một đối tượng "var DashboardCtrl = angular.module ('saApp'). Controller()" hoặc thậm chí những gì tôi đã có nó trước đó từ máy phát điện yeoman, và quy định trong tài liệu angularjs của:

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

với một đường:

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

sẽ không hoạt động.

+0

bạn đã thử sử dụng góc 1.0.5 –

+0

chỉ cần cho nó một đi, cùng một lỗi –

+0

Tôi đang bị mắc kẹt về điều này quá! Tôi muốn tham khảo một phương pháp điều khiển trong thuộc tính route.resolve trong đối số thứ 2 của $ routeProvider.when(). Làm thế nào tôi có thể làm khi sử dụng mô-đun kiểu định nghĩa bộ điều khiển? (cũng sử dụng yeoman) Tôi bị mắc kẹt! – deck

Trả lời

2

Tôi gặp vấn đề tương tự. Bạn có thể giải quyết nó bằng cách làm như sau ..

Xóa khai báo bộ điều khiển khỏi các tuyến .when() phương pháp. Vì vậy, đây ...

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

trở thành chỉ này ...

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

Bây giờ để duy trì phạm vi của bạn, hãy thêm miêu tả bộ điều khiển trong html mẫu của bạn. Ví dụ..

<div ng-controller="DashboardCtrl">{{Some fancy dashboard stuff}}</div> 
4

này trả về đối tượng điều khiển:

var myCtrl = myApp.controller('whatever'... 

Nhưng con đường muốn các chức năng điều khiển thực tế. Vì vậy .... giả định này là bộ điều khiển và quyết tâm của bạn: (chú ý tôi đặt tên cho điều khiển 'IndexCtrl' ... tôi không nghĩ rằng bạn đã làm điều đó trong mã của bạn)

myApp = angular.module('myApp') 

var IndexCtrl = myApp.controller('IndexCtrl', function($scope){ 
    .. blah blah... 
}) 
IndexCtrl.resolve = { 
    loadData:function(){ ... blah blah... } 
} 

Bạn có thể có góc nhìn lên bộ điều khiển bằng cách truyền tên. (thông báo tham chiếu bộ điều khiển là một chuỗi)

.when('/',{controller:'IndexCtrl', resolve:IndexCtrl.resolve}) 
8

Tôi đã gặp lỗi này nhiều lần và cuối cùng tìm ra giải pháp hoàn hảo và đơn giản. Chỉ cần đặt tên điều khiển của bạn trong 'khi' xây dựng vào dấu ngoặc kép như thế này:

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

thay vì

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

Cũng sẽ xảy ra nếu bạn vô tình bao gồm thêm ngoặc khi bạn liên kết tại nhà máy của bạn:

BAD:

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

TỐT:

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

Điều này không chính xác đối với tôi - tôi đã rời khỏi 'MonkeyFactory' hoàn toàn như một sự giám sát, nhưng điều này khiến tôi bắt đầu nhìn xuống con đường bên phải. – Danny

1

Điều này cũng sẽ xảy ra nếu bạn đang sử dụng Coffescript + angularjs.

Vì angularj hỗ trợ các lớp Coffescript.

class IndexCtrl 
    constructor:() -> 

myApp.controller('IndexCtrl',IndexCtrl) 

sau đó trong .Khi()

những 'điều khiển: IndexCtrl' nhìn thấy một đối tượng, không phải là một chức năng.

2

Hoặc nếu bạn nhầm lẫn đã tiêm sau tên của nhà máy/bộ điều khiển như thế này (Cách sai);

angular.module('MyModule') 
    .factory('MyFactory', 'AnotherFactory', ['$http', function($http, AnotherFactory){ 
     // CODE HERE 
    }]); 

Đúng cách;

angular.module('MyModule') 
    .factory('MyFactory', ['$http', 'AnotherFactory', function($http, AnotherFactory){ 
     // CODE HERE 
    }]); 
2

Tôi gặp lỗi này khi thực hiện mô-đun chế nhạo với Karma trong Coffeescript.

Giải pháp là thêm "return null" vào cuối hàm ($ provide) ->. Không có điều đó, coffeescript sẽ trả về kết quả của $ provide.value(), mà tôi đoán là một đối tượng, mà bằng cách nào đó gây ra "fn không phải là một chức năng".

Ví dụ:

module 'myModule', ($provide)-> 
    $provide.value 'myInjectable', 
    myFunction:-> return "dummy value" 
    return null # prevents "fn is not a function" 
2

tôi đã có thể giải quyết việc này "fn không phải là một chức năng, có đối tượng" bằng cách nhập 'chức năng' của tôi từ tập tin khác bằng cách thêm {} như thế này:

import {MenuCtrl} from './controllers/MenuCtrl.js'; 

cách cũ:

import MenuCtrl from './controllers/MenuCtrl.js'; 

Được tham chiếu vấn đề này: https://github.com/swimlane/angular-data-table/issues/189

Các vấn đề liên quan