नियंत्रक नहीं एक समारोह, अपरिभाषित हो गया, जबकि विश्व स्तर पर नियंत्रकों को परिभाषित करता है


123

मैं कोणीयज का उपयोग करके एक नमूना आवेदन लिख रहा हूं। मुझे क्रोम ब्राउजर पर नीचे उल्लेखित त्रुटि मिली।

त्रुटि है

त्रुटि: [ng: areq] http://errors.angularjs.org/1.3.0-beta.17/ng/areq?p0=ContactController&p1=not%20a%20function%2C%%gotgot%20undefined

जो के रूप में प्रदान करता है

तर्क 'कॉन्टैक्टकंट्रोलर' एक फ़ंक्शन नहीं है, अपरिभाषित हो गया

कोड

<!DOCTYPE html>
<html ng-app>
<head>
    <script src="../angular.min.js"></script>
    <script type="text/javascript">
        function ContactController($scope) {
            $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];

            $scope.add = function() {
                $scope.contacts.push($scope.newcontact);
                $scope.newcontact = "";                 
            };
        }    
    </script>    
</head>

<body>    
    <h1>  modules sample </h1>

    <div ng-controller="ContactController">
        Email:<input type="text" ng-model="newcontact">
        <button ng-click="add()">Add</button>

        <h2> Contacts </h2>
        <ul>
            <li ng-repeat="contact in contacts"> {{contact}} </li>
        </ul>    
    </div>
</body> 
</html>

जवाबों:


172

कोणीय 1.3+ के साथ अब आप वैश्विक गुंजाइश (स्पष्ट पंजीकरण के बिना) पर वैश्विक नियंत्रक घोषणा का उपयोग नहीं कर सकते। आपको module.controllerसिंटैक्स का उपयोग करके नियंत्रक को पंजीकृत करना होगा ।

उदाहरण:-

angular.module('app', [])
    .controller('ContactController', ['$scope', function ContactController($scope) {
        $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];

        $scope.add = function() {
            $scope.contacts.push($scope.newcontact);
            $scope.newcontact = "";

        };
    }]);

या

function ContactController($scope) {
    $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];

    $scope.add = function() {
        $scope.contacts.push($scope.newcontact);
        $scope.newcontact = "";
    };
}
ContactController.$inject = ['$scope'];
angular.module('app', []).controller('ContactController', ContactController);

यह एक ब्रेकिंग चेंज है लेकिन इसे ग्लोबल्स का इस्तेमाल करके बंद किया जा सकता हैallowGlobals

उदाहरण:-

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

यहां से कोणीय स्रोत की टिप्पणी है: -

  • जाँच करें कि क्या दिए गए नाम के साथ एक नियंत्रक के माध्यम से पंजीकृत है $controllerProvider
  • जाँच करें कि क्या वर्तमान क्षेत्र पर स्ट्रिंग का मूल्यांकन एक निर्माता को देता है
  • अगर $ कंट्रोलरप्रोवाइडर # allowGlobals, window[constructor]वैश्विक windowऑब्जेक्ट पर जांच करें (अनुशंसित नहीं है)
 .....

expression = controllers.hasOwnProperty(constructor)
            ? controllers[constructor]
            : getter(locals.$scope, constructor, true) ||
                (globals ? getter($window, constructor, true) : undefined);

कुछ अतिरिक्त जांचें: -

  • ng-appअपने कोणीय मूल तत्व (जैसे: - html) पर निर्देश में appname रखना सुनिश्चित करें । उदाहरण: - ng-app = "myApp"

  • यदि सब कुछ ठीक है और आपको अभी भी समस्या हो रही है तो सुनिश्चित करें कि आपके पास स्क्रिप्ट में शामिल सही फ़ाइल है।

  • आपने अलग-अलग स्थानों पर दो बार एक ही मॉड्यूल को परिभाषित नहीं किया है, जिसके परिणामस्वरूप किसी भी संस्था में पहले से परिभाषित एक ही मॉड्यूल को हटा दिया जाता है, उदाहरण के लिए angular.module('app',[]).controller(..और फिर से दूसरी जगह angular.module('app',[]).service(..(पाठ्यक्रम की दोनों लिपियों के साथ) पहले पंजीकृत नियंत्रक का कारण बन सकता है मॉड्यूल appको मॉड्यूल के दूसरे मनोरंजन के साथ साफ किया जाना है।


सुझाव के अनुसार इसे कैसे जांचें? जाँच करें कि क्या दिए गए नाम वाला नियंत्रक $ कंट्रोलर के माध्यम से पंजीकृत है
21

app.register.controller ('TheController', TheController); मेरे लिए चाल चली।
मॉर्फ85

33

मुझे यह समस्या इसलिए आई क्योंकि मैंने नियंत्रक-परिभाषा फ़ाइल को बंद कर दिया था:

(function() {
   ...stuff...
});

लेकिन मैं उस परिभाषा कोड को निष्पादित करने के लिए वास्तव में उस बंद को लागू करना भूल गया था और वास्तव में जावास्क्रिप्ट को बताए कि मेरा नियंत्रक मौजूद था। यानी, उपरोक्त होने की जरूरत है:

(function() {
   ...stuff...
})();

नोट () अंत में।


1
+1 दिलचस्प है, ऐसा लगता है कि दृश्य स्टूडियो कभी-कभी स्वचालित रूप से आह्वान को हटा देता है। मैंने इस कोड वाली मौजूदा js फ़ाइल की प्रतिलिपि बनाई है; मूल में आह्वान था, प्रतिलिपि की गई फ़ाइल नहीं थी।
पेपरगोडीला

16

मैं एंगुलर के साथ शुरुआत कर रहा हूं और मैंने कोणीय मूल तत्व में ऐप नाम को शामिल नहीं करने की बुनियादी गलती की है। तो, से कोड बदल रहा है

<html data-ng-app> 

सेवा

<html data-ng-app="myApp"> 

मेरे लिए काम किया। @PSL ने, ऊपर दिए गए अपने जवाब में इसे पहले ही कवर कर लिया है।


8

मेरे पास यह त्रुटि थी क्योंकि मैं angular.module('myApp', [])और के बीच का अंतर नहीं समझता थाangular.module('myApp')

यह मॉड्यूल 'myApp' बनाता है और 'myApp' नाम के किसी भी मौजूदा मॉड्यूल को अधिलेखित करता है:

angular.module('myApp', [])

यह एक मौजूदा मॉड्यूल 'myApp' को पुनः प्राप्त करता है:

angular.module('myApp')

मैं अपने मॉड्यूल को किसी अन्य फ़ाइल में अधिलेखित कर रहा था, ऊपर की पहली कॉल का उपयोग करके जो मैंने उम्मीद के मुताबिक पुनर्प्राप्त करने के बजाय एक और मॉड्यूल बनाया।

यहाँ और अधिक विवरण: https://docs.angularjs.org/guide/module


1
मेरे मामले में, मैंने मॉड्यूल को जोड़ा, मैंने नियंत्रक को जोड़ा, लेकिन मैं ऐप के लिए मॉड्यूल की सूची में मॉड्यूल को जोड़ना भूल गया। `angular.module (" ऐप ", [HEREYOURMODULE] ...`
थॉमस

3

मैं बस कोणीय 1.3.3 पर पलायन करता हूं और मैंने पाया कि अगर ऐप ओवरराइड होने पर विभिन्न फाइलों में मेरे पास कई नियंत्रक थे और मैंने घोषित कंटेनर खो दिए।

मुझे नहीं पता कि यह एक अच्छा अभ्यास है, लेकिन शायद एक और के लिए उपयोगी हो सकता है।

var app = app;
if(!app) {
    app = angular.module('web', ['ui.bootstrap']);
}
app.controller('SearchCtrl', SearchCtrl);

2

जब मुझे गलती से redeclared किया गया था तो मुझे यह समस्या थी myApp:

var myApp = angular.module('myApp',[...]);
myApp.controller('Controller1', ...);

var myApp = angular.module('myApp',[...]);
myApp.controller('Controller2', ...);

Redeclare के बाद, Controller1काम करना बंद कर देता है और OP त्रुटि उठाता है।


2

वास्तव में बहुत अच्छी सलाह, सिवाय इसके कि सम्‍मिलित त्रुटि केवल आपके रूट पेज पर क्रिटिकल लिपि गुम होने से हो सकती है

उदाहरण:

पेज: index.html

   np-app="saleApp"

लापता

<script src="./ordersController.js"></script>

जब एक रूट को बताया जाता है कि सेवा करने के लिए कौन सा नियंत्रक और दृश्य है:

 .when('/orders/:customerId', {
     controller: 'OrdersController',
     templateUrl: 'views/orders.html'
 })

इतना आवश्यक अपरिभाषित नियंत्रक मुद्दा नियंत्रक को संदर्भित नहीं करने की इस आकस्मिक गलती में भी हो सकता है!


0

यह त्रुटि तब भी हो सकती है जब आपके पास कई मॉड्यूल के साथ एक बड़ी परियोजना हो। सुनिश्चित करें कि आप कोणीय फ़ाइल में उपयोग किया गया ऐप (मॉड्यूल) वही है जो आप अपने टेम्पलेट में उपयोग करते हैं, इस उदाहरण में " thisApp "।

app.js

angular
.module('thisApp', [])
    .controller('ContactController', ['$scope', function ContactController($scope) {
        $scope.contacts = ["abcd@gmail.com", "abcd@yahoo.co.in"];

        $scope.add = function() {
            $scope.contacts.push($scope.newcontact);
            $scope.newcontact = "";

        };
    }]);

index.html

  <html>
    <body ng-app='thisApp' ng-controller='ContactController>
         ...
        <script type="text/javascript" src="assets/js/angular.js"></script>
        <script src="app.js"></script>
    </body>
    </html>

0

यदि बाकी सब विफल हो जाता है और आप गुलप या कुछ समान का उपयोग कर रहे हैं ... बस इसे फिर से चलाएँ!

मैं 30mins चौगुनी बर्बाद कर दिया जब सब कुछ की जरूरत है यह पैंट में एक तेजी से किक था।


0

यदि आप मार्गों (उच्च संभावना) का उपयोग कर रहे हैं और आपके कॉन्फ़िगरेशन में एक मॉड्यूल में एक नियंत्रक का संदर्भ है जिसे निर्भरता के रूप में घोषित नहीं किया गया है तो प्रारंभिककरण भी विफल हो सकता है।

उदाहरण के लिए, आपने अपने ऐप के लिए ngRoute कॉन्फ़िगर किया है, जैसे

angular.module('yourModule',['ngRoute'])
.config(function($routeProvider, $httpProvider) { ... });

मार्गों की घोषणा करने वाले ब्लॉक में सावधान रहें,

.when('/resourcePath', { 
templateUrl: 'resource.html',
controller: 'secondModuleController' //lives in secondModule
});

secondModule'एनकाउंटर' के बाद एक निर्भरता के रूप में घोषित करना चाहिए कि इस मुद्दे को हल करना चाहिए। मुझे पता है कि मुझे यह समस्या थी।


0

मुझे यह त्रुटि मिल रही थी क्योंकि मैं कोणीय के पुराने संस्करण का उपयोग कर रहा था जो मेरे कोड के अनुरूप नहीं था।


0

ये त्रुटियां हुईं, मेरे मामले में, सूची.फ़ीड () फ़्यूज़न में वाक्यविन्यास त्रुटियों से पहले; IE11 द्वारा पहचानी नहीं गई सूची की 'खोज' विधि, इसलिए फ़िल्टर विधि द्वारा प्रतिस्थापित करना होगा, जो IE11 और क्रोम दोनों के लिए काम करता है। https://github.com/flrs/visavail/issues/19 देखें


0

यह त्रुटि, मेरे मामले में, IE11 में सूची की विधि खोजने में सिंटैक्स त्रुटि से पहले हुई थी। इसलिए फ़िल्टर विधि द्वारा प्रतिस्थापित विधि के रूप में सुझाव दिया https://github.com/flrs/visavail/issues/19

फिर ऊपर नियंत्रक निर्धारित नहीं त्रुटि को हल कर दिया।


-3

AngularJS 1.4.3 के साथ एक पुराने ट्यूटोरियल का अनुसरण करते हुए मुझे वही त्रुटि मिली। अब तक का सबसे सरल उपाय है कि कोणीय.जेएस स्रोत से संपादित किया जाए

function $ControllerProvider() {
  var controllers = {},
      globals = false;

सेवा

function $ControllerProvider() {
  var controllers = {},
      globals = true;

और बस के रूप में ट्यूटोरियल का पालन करें, और पदावनत वैश्विक कार्यों बस नियंत्रकों के रूप में काम करते हैं।


यह बुरा अभ्यास है। जैसा कि PSL के उत्तर में बताया गया है, आप इस प्रकार कर सकते हैं:angular.module('app') .config(['$controllerProvider', function($controllerProvider) { $controllerProvider.allowGlobals(); }]);
gm2008

-1। यह सुनिश्चित करने का एक शानदार तरीका यह भी है कि (a) आप अपग्रेड करते ही इसे ओवरराइट कर देते हैं, जो अनावश्यक (और गलत) रिपोर्टें उत्पन्न करेगा कि "1.4.3 से 1.4.4 में अपग्रेड करने से मेरा एप्लिकेशन टूट गया!" और / या (बी) आप अपने ऐप को अपग्रेड नहीं करते क्योंकि "यह कठिन है।"
फिलिप कोपले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.