Angular JS:由于以下原因无法实例化模块测试:

Angular JS : Failed to instantiate module test due to:

我正在 运行 在 HTML 文件中添加一些 Javascript。我正在尝试将一些 Angular JS 与函数 ng-repeat 一起使用。每次我 运行 它,我都会在控制台中收到此错误:

angular.js:38 Uncaught Error: [$injector:modulerr]

当我在控制台的错误消息中单击 link 时,我得到了这个:

Failed to instantiate module test due to: Error: [$injector:nomod] http://errors.angularjs.org/1.6.4/$injector/nomod?p0=test at https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:6:425 at https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:26:270 at b (https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:25:299) at https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:26:44 at https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:42:117 at q (https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:7:495) at g (https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:41:476) at eb (https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:46:44) at c (https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:21:373) at Sc (https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js:22:179

这是我的 HTML 文件中的 Javascript:

//Get User ID and Trip ID in URL 

function GetURLParameter(sParam)
{
var sPageURL = window.location.search.substring(1);
var sURLVariables = sPageURL.split('&');
for (var i = 0; i < sURLVariables.length; i++)
{
    var sParameterName = sURLVariables[i].split('=');
    if (sParameterName[0] == sParam)
    {
        return sParameterName[1];
    }
}
}

 var userid = GetURLParameter('userid');
 var tripid = GetURLParameter('tripid');

  </script>

<script>

 //Get photos URL inside a particular Trip ID from a User ID

  var database = firebase.database();
  database.ref(`photos/${userid}/trips/${tripid}`).once('value') // 
  will return you all the photo objects inside the `tripId`
  .then(photosSnap => {
  var photosObj = photosSnap.val();
  var photosUrl = Object.keys(photosObj).map(key => 
  photosObj[key].photourl);
  // then you can return the array or use it here;


   var app = angular.module('test', []);

     app.controller('MainCtrl', function($scope) {
       $scope.urls = photosUrl;

   });

console.log(photosUrl); // will be an array of all the photourls
}).catch(err => alert(err));

最后是我的 HTML,它使用 ng-repeat:

<div class="spot" ng-app="test" ng-controller="MainCtrl">

     <ul>
        <li ng-repeat="url in urls">{{url}}</li>
     </ul> 

 </div>

我正在使用一个带有作用域的控制器在我的 HTML 中循环一个数组。所以首先我不知道我的错误消息来自哪里,其次我不确定我是否正确使用了控制器和 ng-repeat。

谢谢

PS:我在 HTML 文件的 head 标签中包含了这个 link :

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>

编辑:我的 Javascript 在我的 HTML 更新了(我把所有东西都移到了控制器里面)

错误消息消失了,我的 html 只是没有显示任何 url(虽然控制台显示我的数组 photosUrl 中有 4 个 url)

 <script>

  //Get photos URL inside a particular Trip ID from a User ID


var app = angular.module('test', []);

app.controller('MainCtrl', function($scope) {

    var database = firebase.database();
    database.ref(`photos/${userid}/trips/${tripid}`).once('value') // 
    will return you all the photo objects inside the `tripId`
    .then(photosSnap => {
    var photosObj = photosSnap.val();
    var photosUrl = Object.keys(photosObj).map(key => 
    photosObj[key].photourl);
    // then you can return the array or use it here;

    $scope.urls = photosUrl;

console.log(photosUrl); // will be an array of all the photourls
}).catch(err => alert(err));

     });

  </script>

您应该将 database 移动到您的 'MainCtrl' 控制器中。

或者,在一个完美的世界中,您可以将该逻辑抽象为一个单独的 factory/service,并将其注入到您的控制器中。

nomod 是 Angular 的错误,表明您要求它使用的模块尚未定义。

当您指定 ng-app 时,AngularJS 将自动尝试查找您使用该名称定义的模块以将其加载到该块中。但是你在 Firebase .once() 的回调中异步定义你的模块。在某些情况下,该回调可能会很快发生,但它仍然是异步的,并且在 Angular 开始时不会准备好。

  1. 将您的 angular.module() 定义移到 Firebase 回调之外。
  2. 在 Firebase 数据回调中的设置 $scope.urls = 下方添加 $scope.$apply()