AngularJS hatası: '' FirstCtrl 'bağımsız değişkeni bir işlev değil, tanımsız hale geldi'


94

Aynı sorunun burada birkaç kez sorulduğunu fark ettim, çözmeyi denedim ama hiçbir şey yardımcı olmuyor.

Bu öğreticiyi egghead videoları ile takip ediyorum.

Ancak Denetleyiciler ve Denetleyiciler arasında veri paylaşımı bölümüne geldiğimde, onu çalıştıramıyorum.

Chrome ile çalıştırdığımda, konsolda şu hatayı alıyorum:

'FirstCtrl' bağımsız değişkeni bir işlev değil, tanımsız hale geldi '.

Gerçekten sorunun ne olduğunu bilmiyorum. Kod, öğreticideki ile aynıdır.

HTML

<!DOCTYPE html>
<html ng-app>
 <head>
    <title>AngularJS Tutorials: Controllers</title>
    <link rel="stylesheet" href="mystyle.css">
    <script src="http://code.angularjs.org/1.2.0-rc.2/angular.min.js"></script>
 </head>
 <body>
    <div ng-app="">
       <div ng-controller="FirstCtrl">   
           <h1> {{data.message + " world"}}</h1>

           <div class="{{data.message}}">
               Wrap me in a foundation component
           </div>
       </div>
    </div>
    <script type="text/javascript" src="main.js"></script>
 </body>
</html> 

main.js

function FirstCtrl($scope){
   $scope.data = { message: "Hello" };
} 

Burada ikinci yorumlarda çözümdür - stackoverflow.com/questions/24894870/...
Kanchan

Yanıtlar:


109

Html'nizde 2 adsız ng-appdirektifiniz var .
Bölümünüzdeki birini kaybedin.

Güncelle
Farklı bir yaklaşım deneyelim.
Js dosyanızda bir modül tanımlayın ve ng-appyönergeyi ona atayın . Bundan sonra, denetleyiciyi basit bir işlev olarak değil, bir ng bileşeni gibi tanımlayın:

<div ng-app="myAppName">  
<!-- or what's the root node of your angular app -->

ve js kısmı:

angular.module('myAppName', [])
    .controller('FirstCtrl', function($scope) {
         $scope.data = {message: 'Hello'};
    });

İşte tam da bunu yapan çevrimiçi bir demo: http://jsfiddle.net/FssbL/1/


Cevap için çok teşekkürler, ne yazık ki hala aynı hatayı alıyorum .. Bu yüzden div'den ng-app = "" kaybettim, ama yine de çalışmıyor.
Pumba

1
Yardımın için çok teşekkür ederim! Artık anlamıyorum, burada ve çevrimiçi demoda gösterdiğinle aynı şeyi yaptım ama yine de 'FirstCtrl' tanımsız diyor. En başından itibaren tekrar deneyeceğim, umarım çalıştırırım, çünkü sonraki derslerde aynı sorunu yaşıyorum.
Pumba

Harika!! İşe yarıyor. Js dosyası için komut dosyası etiketindeki type özniteliğini kapatmayı unuttum. Ve bu, ikinci çözümünüzle birlikte işe yaradı! Çok teşekkür ederim :))
Pumba

6
Demo video, denetleyiciyi modül içinde sarmaz. Öyleyse neden onun için çalışıyor, ama benim için değil? egghead.io/lessons/angularjs-controllers
Demodave

2
@ Demodave, aynı sorum var. Videoların AngularJS'in önceki bir sürümünde kaydedildiğini ve bu nedenle denetleyicileri tanımlamak potansiyel olarak daha az katı olduğunu varsayıyorum (ancak bu sadece benim varsayımım, birinin onaylamasından veya reddetmesinden memnun olurum)
MandM

93

Tam olarak aynı hata mesajını aldım ve benim durumumda denetleyici JS dosyasını (örn. First-ctrl.js) index.html dosyamda listelemedim


1
Controller js dosyasını listelemediğin ne demek? Onu dahil etmediğini mi söylüyorsun?
Demodave

@DavidStone evet - o zamanlar benim durumum buydu.
Mariusz

Başka bir noob hatası: Denetleyicideki yönlendirici parantez vb. Konsolda aynı tür hatanın görüntülenmesine neden olabilir.
user2938649

9

Bu öğreticiyi az önce yaptım ve @ gion_13 cevabını takip ettim. Hâlâ işe yaramadı. Dizindeki ng-app adımı js dosyamdakiyle aynı yaparak çözdüm. Alıntılar bile tamamen aynı. Yani:

<div ng-app="myapp">
    <div ng-controller="FirstCtrl">

ve js:

 angular.module("myapp", [])
.controller('FirstCtrl',function($scope) {
    $scope.data= {message:"hello"};
  });

Ng-uygulamasının aynı olması gerektiği tuhaf ama ng-denetleyicisinin olmaması.


Bunun bana
dört

7

Sen senin adını gerekirng-app , uygulamanızı veren ad; sadece kullanmak ng-app yeterli değildir .

Onun yerine:

<html ng-app>
...

Bunun yerine bunun gibi bir şeye ihtiyacınız olacak:

<html ng-app="app">
...

Sonra da şöyle:

var app = angular.module("app", []).controller("ActionsController", function($scope){});

5

Bir başka güzel: Modülleri yanlışlıkla yeniden tanımlamak. Bugün biraz fazla hevesle bir şeyler kopyaladım / yapıştırdım ve bir yerde bir modül tanımına sahip oldum, denetleyici tanımlarımla geçersiz kıldım:

// controllers.js - dependencies in one place, perfectly fine
angular.module('my.controllers', [/* dependencies */]);

Daha sonra tanımlarımda, ona şu şekilde gönderme yapmam gerekiyordu:

// SomeCtrl.js - grab the module, add the controller
angular.module('my.controllers')
 .controller('SomeCtrl', function() { /* ... */ });

Bunun yerine yaptığım şey şuydu:

// Do not try this at home!

// SomeCtrl.js
angular.module('my.controllers', []) // <-- redefined module, no harm done yet
  .controller('SomeCtrl', function() { /* ... */ });

// SomeOtherCtrl.js
angular.module('my.controllers', []) // <-- redefined module - SomeCtrl no longer accessible
  .controller('SomeOtherCtrl', function() { /* ... */ });

Aramadaki ekstra ayracı not edin angular.module.


3

ng-app = "" öğesini kaldırmak

<div ng-app="">

ve basitçe yap

<div>

3
Uygulamanızın yapılandırmasında yönlendirme kullanıyorsanız, html'de ng-controller kullanmadığınızdan emin olun. Bunun yerine ng-görünümüne sahip olmalısınız. Denetleyici, genellikle yönlendirmedeki görünümlerle birlikte tanımlanacaktır.
Marc

1

Ben de aynı sorunla karşılaştım. Ancak sorun, modülü ng-uygulamasının bağlı olduğu modüller listesinde listelemeyi unutmuş olmamdı.


3
Bu bir cevap değil, bir yorum olmalıdır.
Anthony Perot

1

Bu sorunla karşılaştım ve aşağıdaki şekilde düzeltildi:

  1. ilk önce ng-app'i şuradan kaldırın:

    <html ng-app>
    
  2. ng-app adını benimApp'a ekle:

    <div ng-app="myApp">
    
  3. bu kod satırını işlevden önce ekleyin:

    angular.module('myApp', []).controller('FirstCtrl',FirstCtrl);
    

betiğin son görünümü:

angular.module('myApp', []).controller('FirstCtrl',FirstCtrl);

function FirstCtrl($scope){
    $scope.data = {message: "Hello"};
} 

1

Benim durumumda, bu mesaj ana modüldeki unutulmuş bağımlılık enjeksiyonundan geliyor


1

Bu, açısal uygulama kodunuzu birden fazla kez eklemek için yanlış yapılandırılmışsa olabilir. Benim durumumda, bu index.js içindeydi ve onu js dosyalarının dizininin bir parçası olarak (gulp içinde globbed) denetleyici bildirimlerimden önce ve sonra ekliyordu. Index.js için küçültülmemesi ve ikinci kez enjekte edilmemesi için bir dışlama ekledikten sonra uygulamam çalışmaya başladı. Yukarıdaki çözümlerden herhangi biri sorununuzu çözmezse başka bir ipucu.


1

İlk olarak - Modül adı tanımlanmamışsa, JS'de modüle erişemez ve denetleyiciyi ona bağlayamazsınız.

Açısal modüle modül adını sağlamanız gerekir. tanımlama modülünün kullanımında da bir fark var 1. angular.module ("firstModule", []) 2. angular.module ("firstModule")

1 - Biri, ikinci argümanlara bağımlılık eklenmeden yeni "firstModule" modülünü bildirmektir. 2 - Bu, başka bir yerde başlatılan ve başlatılmış modülü almaya ve üzerinde değişiklik yapmaya çalışan "ilk modül" ü kullanmak içindir.


0

Bu sorunla karşılaştım ancak denetleyiciyi yeniden adlandırarak bu sorunu çözebildim, lütfen bir deneyin.

ctrlSub.execSummaryDocuments = function(){};

0

bazen işlevin içindeki kodun sözdizimindeki yanlış bir şey bu hatayı atar. İşlevinizi doğru bir şekilde kontrol edin. Benim durumumda, Json alanlarını değerlerle atamaya çalışırken ve iki nokta üst üste kullanarak: eşit işareti yerine atama yapmak için = ...


0

İki farklı javascript dosyasında aynı adı taşıyan iki denetleyicim vardı. Bu açısallığı tahriş etmek, bir ad alanı çakışmasına işaret eden daha net bir hata mesajı veremez.


0

Bu eğitimden emin değilim, ancak dosyayı grunt / yudum küçültme sürecine dahil etmeyi unuttuğumda aynı sorunu yaşadım.

grunt.initConfig({
  uglify: {
    my_target: {
      files: {
        'dest/output.min.js': ['src/input1.js', 'src/missing_controller.js']
      }
    }
  }
});

Umarım yardımcı olur.


0

Mektup kasanıza da dikkat edin. Bu böceğin peşinden iyi bir saat geçirdim.

<section id="forgotpwd" ng-controller="ForgotPwdController">

denetleyiciyi adlandırırken

angular
    .module('app')
    .controller('ForgotpwdController', ForgotpwdController);

Hepsi tutarlı bir şekilde adlandırılmalıdır, bu durumda Forgot p wdController küçük harf p ile.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.