Lỗi: Đối số không phải là một hàm, không được xác định


120

Sử dụng AngularJS với Scala Play, tôi gặp lỗi này.

Lỗi: Đối số 'MainCtrl' không phải là một hàm, không được xác định

Tôi đang cố gắng tạo một bảng bao gồm các ngày trong tuần.

Vui lòng xem mã của tôi. Tôi đã kiểm tra tên của Bộ điều khiển, nhưng điều đó có vẻ đúng. Lưu ý: Mã được sử dụng từ câu trả lời SO này

index.scala.html

@(message: String)

@main("inTime") {

<!doctype html>
<html lang="en" ng-app>
    <head>
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
    </head>
<div ng-controller="MainCtrl">
    <table border="1">
    <tbody ng-repeat='(what,items) in data'>
      <tr ng-repeat='item in items'>
        <td ngm-if="$first" rowspan="{{items.length}}">{{what}}</td>
        <td>{{item}}</td>
      </tr>
    </tbody>
  </table>
</div>
</html> 
}

MainCtrl.js

(function() {
    angular.module('[myApp]', []).controller('MainCtrl', function($scope) {
        $scope.data = {
            Colors: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
        }
    });
}());

15
Trong html mà bạn đã sử dụng ng-appbạn có thể thay đổi nó thànhng-app=myApp
Chandermani

Có những lỗi tương @Chandermani
Kevin Meredith

Bạn đã thử xóa đóng (IIFE) khỏi mã chưa? Khi tôi gặp sự cố này, đó là do tôi đã gặp lỗi PHP trong javascript của mình.
Kevin Beal

1
Bạn có thể tìm hiểu vấn đề của bạn, bởi danh sách kiểm tra này: stackoverflow.com/a/26797874/930170
Sergei Panfilov

Xác nhận xem bạn đã thêm MainCtrl.controller.js được thêm vào tệp BundleConfig.cs hay chưa
Syed Mohamed

Câu trả lời:


107

Xóa tên []khỏi tên ([myApp]) của mô-đun

angular.module('myApp', [])

Và thêm ng-app="myApp"vào html và nó sẽ hoạt động.


1
Tất cả những gì tôi phải làm để nó hoạt động là gợi ý thứ hai (tức là đặt ng-app = "myApp"). Nếu tôi xóa [], tôi gặp một lỗi khác.
Jason

15
Có tham số thứ hai []cho biết rằng bạn đang tạo một mô-đun mới. Loại bỏ tham số thứ hai cho biết rằng bạn đang truy xuất một mô-đun hiện có. Vì vậy, một khả năng để kiểm tra là nếu bạn đang gọi angular.modulehai lần, cả hai lần bao gồm cả tham số thứ hai. Nếu vậy, sự xuất hiện sau đó sẽ ghi đè thứ hai, ẩn bất kỳ định nghĩa nào về bộ điều khiển cho đến thời điểm đó.
Carl G

26
Khi anh ta nói để loại bỏ, []anh ta đang đề cập đến tham số đầu tiên mà OP có [myApp]thay vì myApp. Anh ấy không nói về tham số thứ hai.
Kevin Beal

1
Kiểm tra tên bộ điều khiển của bạn nếu bạn đang sử dụng các tuyến đường. Tên bộ điều khiển trong định nghĩa tuyến có phân biệt chữ hoa chữ thường.
Chiến binh Latinh

78

ĐẦU TIÊN. kiểm tra xem bạn có đúng controllertrong định nghĩa tuyến đường, giống như tên bộ điều khiển mà bạn đang xác định không

communityMod.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/members', {
        templateUrl: 'modules/community/views/members.html',
        controller: 'CommunityMembersCtrl'
      }).
      otherwise({
        redirectTo: '/members'
      });
  }]);

communityMod.controller('CommunityMembersCtrl', ['$scope',
    function ($scope) {
        $scope.name = 'Hello community';
    }]);

các tên bộ điều khiển khác nhau trong ví dụ này sẽ dẫn đến lỗi, nhưng ví dụ này đúng

THỨ HAI kiểm tra xem bạn đã nhập tệp javascript của mình chưa:

<script src="modules/community/controllers/CommunityMembersCtrl.js"></script>


30
Theo kinh nghiệm của tôi, "thứ hai" của bạn luôn là vấn đề. Tôi thường quên nhập bộ điều khiển của mình vàoindex.html
msanford

Đó là lần thứ hai trong trường hợp của tôi, quên nhập tệp JS ...
Saurabh Misra

26

Tôi đã gặp thông báo lỗi tương tự (trong trường hợp của tôi: "Đối số 'languageSelectorCtrl' không phải là một hàm, không được xác định").

Sau một số so sánh tẻ nhạt với mã của Angular seed, tôi phát hiện ra rằng trước đây tôi đã xóa một tham chiếu đến mô-đun bộ điều khiển trong app.js. (xem nó tại https://github.com/angular/angular-seed/blob/master/app/js/app.js )

Vì vậy, tôi đã có cái này:

angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.directives'])

Điều này không thành công.

Và khi tôi thêm tham chiếu bị thiếu:

angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.controllers', 'MyApp.directives'])

Thông báo lỗi đã biến mất và Angular có thể cài đặt lại bộ điều khiển.


đã gặp vấn đề tương tự, vấn đề của tôi là tôi quên thêm bộ điều khiển của mình vào mô-đun ứng dụng ... tại sao điều này không xảy ra tự động ??? dù sao cũng cảm ơn!
TheZuck

16

Đôi khi lỗi này là kết quả của hai lệnh được ng-app chỉ định trong html. Trong trường hợp của tôi do nhầm lẫn, tôi đã chỉ định ng-apptrong htmlthẻ của mình và ng-app="myApp"trong bodythẻ như thế này:

<html ng-app>
  <body ng-app="myApp"></body>
</html>

1
Điều đó đã xảy ra với tôi khi tôi không thêm phần tiêm vào mô-đun myApp.
Ghandhikus

Cảm ơn bạn! Điều này đã khắc phục sự cố của tôi.
braised_gross

6

Điều này thực sự khiến tôi mất 4 GIỜ (bao gồm cả các tìm kiếm vô tận trên SO) nhưng cuối cùng tôi đã tìm thấy nó: do nhầm lẫn (vô ý) tôi đã thêm một khoảng trống ở đâu đó.

Bạn có thể phát hiện ra nó không?

angular.module('bwshopper.signup').controller('SignupCtrl ', SignupCtrl);

Vì vậy ... 4 giờ sau tôi thấy rằng nó phải là:

angular.module('bwshopper.signup').controller('SignupCtrl', SignupCtrl);

Hầu như không thể nhìn thấy chỉ bằng mắt thường.

Điều này nhấn mạnh tầm quan trọng sống còn của việc kiểm soát sửa đổi (git hoặc bất cứ thứ gì) và kiểm tra đơn vị / hồi quy.


1
Câu trả lời của tôi không phải là một khoảng trống thừa nhưng nó dẫn tôi đến cách khắc phục. Tôi đã có Controllerthay vì controllervà đó là tất cả những gì nó cần.
Grandizer

Và tôi đã đặt tên tệp là options-moda.controller.js nhưng đang tìm kiếm options-modal.controller.js DOH!
theFish

Của tôi là do tôi quên thêm .js trong BundleConfig. Đơn giản nhưng bực bội.
Ege Bayrak

4

Tôi đã gặp phải vấn đề tương tự và trong trường hợp của tôi, nó đã xảy ra do sự cố này:

Tôi đã xác định các bộ điều khiển trong một mô-đun riêng biệt (được gọi là 'myApp.controllers') và được đưa vào mô-đun ứng dụng chính (được gọi là 'myApp') như sau:

angular.module('myApp', ['myApp.controllers'])

Một đồng nghiệp đã đẩy một mô-đun bộ điều khiển khác trong một tệp riêng biệt nhưng có cùng tên với tên của tôi (tức là 'myApp.controllers') gây ra lỗi này. Tôi nghĩ vì Angular đã nhầm lẫn giữa các mô-đun điều khiển đó. Tuy nhiên, thông báo lỗi không hữu ích lắm trong việc phát hiện ra điều gì đang xảy ra.


1
Điều này sẽ được khắc phục bằng cách loại bỏ tham số thứ hai trong mô-đun ... Để lấy mô-đun hiện có bằng cách sử dụng angle.module ('myApp') mà không có tham số thứ hai. tức là angle.module ('myApp'). contoller (...)
Santhosh

3

Trong trường hợp của tôi (có trang tổng quan và trang "thêm"), tôi đã nhận được điều này với thiết lập định tuyến của mình như bên dưới. Nó đang đưa ra thông báo cho AddCtrl không thể được đưa vào ...

$routeProvider.
  when('/', {
    redirectTo: '/overview'
  }).      
  when('/overview', {
    templateUrl: 'partials/overview.html',
    controller: 'OverviewCtrl'
  }).
  when('/add', {
    templateUrl: 'partials/add.html',
    controller: 'AddCtrl'
  }).
  otherwise({
    redirectTo: '/overview'
  });

Bởi vì when('/' tuyến đường, tất cả các tuyến đường của tôi đã đi đến tổng quan và bộ điều khiển không thể khớp trên kết xuất trang / thêm tuyến đường. Điều này gây nhầm lẫn vì tôi đã DID thấy mẫu add.html nhưng không tìm thấy bộ điều khiển của nó.

Loại bỏ '/' - tuyến đường khi trường hợp đã khắc phục được sự cố này cho tôi.


Tôi cũng nhận được lỗi này và làm rách tóc của tôi vì nó đã làm cho các bản dựng TFS của tôi bị lỗi. Nhận xét về tuyến đường '/' cũng sửa nó cho tôi. Bây giờ để tìm ra lý do tại sao!
Phillip Copley

3

Nếu bạn đang ở trong một mô-đun con, đừng quên khai báo mô-đun trong ứng dụng chính. I E :

<scrip>
angular.module('mainApp', ['subModule1', 'subModule2']);

angular.module('subModule1')
   .controller('MyController', ['$scope', function($scope) {
      $scope.moduleName = 'subModule1';
   }]);
</script>
...
<div ng-app="mainApp">
   <div ng-controller="MyController">
   <span ng-bind="moduleName"></span>
</div>

Nếu bạn không khai báo subModule1 trong mainApp, bạn sẽ có đối số "[ng: areq]" MyController "không phải là một hàm, không được xác định.


2

Điểm thứ hai của tôi là cạm bẫy của tôi nhưng chỉ về bản ghi, có lẽ nó đang giúp ai đó ở đâu đó:

Tôi đã gặp vấn đề tương tự và ngay trước khi tôi phát hiện ra rằng tôi đã quên bao gồm tập lệnh điều khiển của mình.

Vì ứng dụng của tôi dựa trên ASP.Net MVC nên tôi quyết định giữ cho mình tỉnh táo bằng cách chèn đoạn mã sau vào App_Start / BundleConfig.cs của mình

bundles.Add(new ScriptBundle("~/app").Include(
                "~/app/app.js",
                "~/app/controllers/*.js",
                "~/app/services/*.js" ));

và trong Layout.cshtml

<head>
...
   @Scripts.Render("~/app")
...
</head>

Bây giờ tôi sẽ không phải nghĩ đến việc gộp các tệp theo cách thủ công nữa. Trong nhận thức sâu sắc, tôi thực sự nên làm điều này khi thiết lập dự án ...


1

Tôi đã gặp lỗi với LoginController, mà tôi đã sử dụng trong main index.html. Tôi đã tìm thấy hai cách để giải quyết:

  1. thiết lập $ controllerProvider.allowGlobals (), tôi đã tìm thấy nhận xét đó trong Angular change-list "tùy chọn này có thể hữu ích cho việc di chuyển các ứng dụng cũ, nhưng vui lòng không sử dụng nó trong các ứng dụng mới!" bình luận ban đầu về Angular

    app.config (['$ controllerProvider', function ($ controllerProvider) {$ controllerProvider.allowGlobals ();}]);

  2. sai cơ cấu đăng ký bộ điều khiển

trước

LoginController.$inject = ['$rootScope', '$scope', '$location'];

hiện nay

app.controller('LoginController', ['$rootScope', '$scope', '$location', LoginController]);

'ứng dụng' đến từ app.js

var MyApp = {};
var app = angular.module('MyApp ', ['app.services']);
var services = angular.module('app.services', ['ngResource', 'ngCookies', 'ngAnimate', 'ngRoute']);

1

Tôi đã có cùng một lỗi với một lỗi lớn:

appFormid.controller('TreeEditStepControlsCtrl', [$scope, function($scope){

}]);

Bạn thấy không? tôi quên dấu '' trong phạm vi $ đầu tiên, tất nhiên cú pháp đúng là:

appFormid.controller('TreeEditStepControlsCtrl', ['$scope', function($scope){

}]);

Lỗi đầu tiên mà tôi không thấy ngay lập tức là: " $ scope không được xác định ", tiếp theo là " Lỗi: [ng: areq] Đối số 'TreeEditStepControlsCtrl' không phải là một hàm, không được xác định "


0

Nó có thể đơn giản như đặt nội dung của bạn trong "" và bất cứ thứ gì cần trích dẫn ở bên trong bằng '' không?

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

trở thành

<link rel="stylesheet" media="screen" href="@routes.Assets.at('stylesheets/main.css')">

Điều đó có thể gây ra một số vấn đề với phân tích cú pháp


0

Để khắc phục sự cố này, tôi phải phát hiện ra rằng tôi đã viết sai chính tả tên của bộ điều khiển trong khai báo các tuyến đường Angular:

.when('/todo',{
            templateUrl: 'partials/todo.html',
            controller: 'TodoCtrl'
        })

0

Trong trường hợp của tôi, đó là một lỗi đánh máy đơn giản trong index.html:

<script src="assets/javascript/controllers/questionssIndexController.js"></script>

điều đó đáng lẽ phải

<script src="assets/javascript/controllers/questionsIndexController.js"></script>

mà không có phần bổ sung strong tên của bộ điều khiển.


0

Hóa ra đó là Cache của trình duyệt, sử dụng Chrome tại đây. Chỉ cần kiểm tra "Tắt bộ nhớ cache" trong Kiểm tra (Phần tử) đã giải quyết được vấn đề của tôi.


0

Bởi vì cửa sổ bật lên này trong Google khi cố gắng tìm câu trả lời cho: "Lỗi: Đối số '' không phải là một hàm, không được xác định".

Có thể bạn đang cố gắng tạo cùng một mô-đun hai lần.

Angular.module là một nơi toàn cầu để tạo, đăng ký và truy xuất các mô-đun AngularJS.

Truyền một đối số sẽ lấy ra một góc.Module hiện có, trong khi truyền nhiều đối số sẽ tạo ra một góc mới.

Nguồn: https://docs.angularjs.org/api/ng/osystem/angular.module#overview

Thí dụ:

angular.module('myApp', []) Được sử dụng để tạo một mô-đun mà không cần thêm bất kỳ phụ thuộc nào.

angular.module('myApp') (Không có đối số) được sử dụng để lấy một mô-đun hiện có.


0

Xuất hiện nhiều giải pháp làm việc cho thấy lỗi có nhiều nguyên nhân thực tế .

Trong trường hợp của tôi, tôi đã không khai báo bộ điều khiển trong app/index.html:

<scipt src="src/controllers/controller-name.controller.js"></script>

Đã xảy ra lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.