2017-12-11 11 views
0

다른 게시물과 비슷한 호기심 오류가 발생하지만 해결할 수 없었습니다. jQuery의 document.ready()를 사용하여 모든 버튼이 Firebase와 Angularfire로 통합 된 AngularJS 프런트 엔드를 포함하는 로컬 Javascript 파일을 참조하기 전에로드되는지 확인합니다.

내가 일반적으로 참조되지 않은 또는 초기화되지 않은 의존성 주입 각도 컨트롤러를 함께 콘솔에서 다음과 같은 오류 받고 있어요 :

Error: [$injector:nomod] Module 'myApp' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

을 나는 유튜브에 this tutorial을 다음 동안이 코드를 작성하고 기본적으로 모든 것을 동일하게 복사 앞서 언급 한 jQuery를 제외하고.

Index.html을

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>Piano Lessons Administrator Signup</title> 

    <!--Jquery--> 
    <script 
      src="https://code.jquery.com/jquery-3.2.1.min.js" 
      integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" 
      crossorigin="anonymous"></script> 

    <!--AngularJS--> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.js"></script> 

    <!--Firebase Dependency--> 
    <script src="https://www.gstatic.com/firebasejs/4.8.0/firebase.js"></script> 

    <!-- AngularFire --> 
    <script src="https://cdn.firebase.com/libs/angularfire/2.3.0/angularfire.min.js"></script> 

    <!--Local Javascript--> 
    <script> 
    $(document).ready(function(){ 
     $(function(){ 
      $.getScript('javascripts/piano.js'); 
     }); 
    }); 
    </script> 
    </head> 


    <body ng-app="myApp"> 
     <div ng-congroller="MyCtrl as ctrl"> 

     <pre>{{ ctrl.object | json }} </pre> 

     </div> <!--End myCtrl--> 
    </body> 

... 
</html> 

... 그리고 Piano.js

(function() { 

// Initialize Firebase 
var config = { 
    apiKey: "myApikey", 
    authDomain: "myAuthDomain", 
    databaseURL: "myDatabaseURL", 
    projectId: "projectId", 
    storageBucket: "myStorageBucket", 
    messagingSenderId: "MyMessagingSender" 
}; 
firebase.initializeApp(config); 

var myApp = angular 
    .module('myApp', ['firebase']) 
    .config(function ($firebaseRefProvider) { 
    $firebaseRefProvider.registerUrl({ 
     default: config.databaseURL, 
     object: `${config.databaseURL}/angular/object` 
    }); 
}) 
    .factory('ObjectFactory', ObjectFactory) 
    .controller('MyCtrl', MyCtrl); 

function ObjectFactory($firebaseObject, $firebaseRef){ 
    return $firebaseObject($firebaseRef.object); 
} 

function MyCtrl(ObjectFactory){ 
    this.object = ObjectFactory; 
    this.sayHello =() => { 
    //console.log(this.object.name); 
     return `Hello, ${this.object.name}`; 
    } 
} 

const ctrl = new MyCtrl({ name: 'David' }); 
const message = ctrl.sayHello(); 
console.log(message); 

... 
}()); 

는 흥미롭게을 console.log (메시지)가 모듈을 필요로하는 것처럼 보인다 작동하는 것처럼 보인다 컨트롤러 및 팩터 리가 작동하도록 작업하고 있지만 태그의 객체가 컴파일되지 않고 일반 텍스트 (컨트롤러가 실패했음을 나타냄)가 그대로 유지됩니다. 그것을 $ (document) .ready() 안에두면 다른 태그를 범위 밖으로 벗어나게됩니까?

+2

이 getScript''사용하지만, 당신이 할 경우 수동으로 대신 사용하는 것보다 응용 프로그램을 부트 스트랩 할 필요가로드해야하는 이유 없음 아이디어'NG-app' – charlietfl

+0

부품이 @charlietfl 그 I 머리글에 배치 된 경우 찾을 수없는 요소에 대해 오류를 던질 수있는 입력 상자 (특히 일부 입력 상자와 관련 자바 스크립트)는 표시되지 않지만 본문에 스크립트가 포함되어 있으면 각도가로드되지 않습니다. – BobtimusPrime

+1

아마도 스크립트는 지시문에 있어야합니다. 하지만 수동 부트 스트랩 방식이라 할지라도 스크립트 태그에 스크립트를 포함시킬 수 있어야합니다. – charlietfl

답변

1

모듈이 DOMContentLoaded 이벤트 이후에로드되었으므로 앱을 수동으로 부트 스트랩해야합니다.

<body ̶n̶g̶-̶a̶p̶p̶=̶"̶m̶y̶A̶p̶p̶"̶ > 

수동으로 모듈이로드 된 후 응용 프로그램 부트 스트랩 : 자세한 내용은 다음을 참조

$(document).ready(function(){ 
    $(function(){ 
     $.getScript('javascripts/piano.js'); 
     angular.bootstrap(document.body, ['myApp']); 
    }); 
});