Angular 当所有组件都在一个文件中时,应用程序可以正常工作,但当组件在单独的文件中时,会抛出 'nomod' 错误
Angular App works when all components are in one file, but throws 'nomod' error when components are in separate files
具体来说,我正在研究 this tutorial on creating a single-page MEAN stack todo app. I'm on this step。本教程涵盖了代码的模块化,虽然我能够成功地将我的后端代码(Express、Mongo 等)分离到模块中,但当我分离我的 angular.js 代码时,todo 应用程序停止运行.抛出到控制台的具体错误是 "Uncaught Error: [$injector:modulerr]." 具体错误是 "nomod"(即模块 "simpleTodo" 无法加载。)我将不胜感激任何帮助。
编码为一个文件 (core.js):
var simpleTodo = angular.module('simpleTodo', []);
simpleTodo.controller('mainController', ['$scope', '$http', function($scope, $http) {
$scope.formData = {};
$http.get('/api/todos')
.success(function(data) {
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
$scope.createTodo = function() {
$http.post('/api/todos', $scope.formData)
.success(function(data) {
$scope.formData = {};
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
};
$scope.deleteTodo = function(id) {
$http.delete('/api/todos/' + id)
.success(function(data) {
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
};
}]);
模块中的代码:
新 core.js:
var simpleTodo = angular.module('simpleTodo',['todoController', 'todoService']);
Create/Delete待办事项服务(todos.js):
angular.module('todoService', [])
.factory('Todos', ['$http', function($http) {
return {
get: function() {
return $http.get('/api/todos');
},
create: function(todoData) {
return $http.post('/api/todos', todoData);
},
delete: function(id) {
return $http.delete('/api/todos/' + id);
}
}
}]);
控制器文件(main.js)
angular.module('todoController', [])
.controller('mainController', ['$scope', '$http', 'Todos', function($scope, $http, Todos) {
$scope.formData = {};
Todos.get()
.success(function(data) {
$scope.todos = data;
});
$scope.createTodo = function() {
if ($scope.formData !== null) {
Todos.create($scope.formData)
.success(function(data) {
$scope.formData = {};
$scope.todos = data;
});
}
};
$scope.deleteTodo = function(id) {
Todos.delete(id)
.success(function(data) {
$scope.todos = data;
});
};
}]);
index.html 上的脚本加载顺序:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.13/angular.min.js"></script>
<script src="js/controllers/main.js"></script>
<script src="js/services/todos.js"</script>
<script src="js/core.js"></script>
谢谢!
新信息:按照 floribon 的建议,我得到了同样的错误,除了不是 "simpleTodo" 加载失败,而是 "todoController" 无法加载。我很感激他的建议,但它仍然没有用。 :( 这是一个 github 仓库,如果你想看的话,他的更改已实施:https://github.com/LeungEnterprises/simpleTodo
由于您的控制器需要解析 Todos
依赖项,因此您需要将服务 todoService
添加到其模块依赖项中:
angular.module('todoController', ['todoService'])
此外,您需要在 main.js
文件之前加载 todos.js
文件(当然它需要前者)
我仔细阅读了我的文件,经过大量实验后我推断出问题是由 HTML 文件引起的。问题是未关闭的脚本标签。
不过,我非常感谢大家的帮助,尤其是@floribon!
具体来说,我正在研究 this tutorial on creating a single-page MEAN stack todo app. I'm on this step。本教程涵盖了代码的模块化,虽然我能够成功地将我的后端代码(Express、Mongo 等)分离到模块中,但当我分离我的 angular.js 代码时,todo 应用程序停止运行.抛出到控制台的具体错误是 "Uncaught Error: [$injector:modulerr]." 具体错误是 "nomod"(即模块 "simpleTodo" 无法加载。)我将不胜感激任何帮助。
编码为一个文件 (core.js):
var simpleTodo = angular.module('simpleTodo', []);
simpleTodo.controller('mainController', ['$scope', '$http', function($scope, $http) {
$scope.formData = {};
$http.get('/api/todos')
.success(function(data) {
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
$scope.createTodo = function() {
$http.post('/api/todos', $scope.formData)
.success(function(data) {
$scope.formData = {};
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
};
$scope.deleteTodo = function(id) {
$http.delete('/api/todos/' + id)
.success(function(data) {
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
};
}]);
模块中的代码:
新 core.js:
var simpleTodo = angular.module('simpleTodo',['todoController', 'todoService']);
Create/Delete待办事项服务(todos.js):
angular.module('todoService', [])
.factory('Todos', ['$http', function($http) {
return {
get: function() {
return $http.get('/api/todos');
},
create: function(todoData) {
return $http.post('/api/todos', todoData);
},
delete: function(id) {
return $http.delete('/api/todos/' + id);
}
}
}]);
控制器文件(main.js)
angular.module('todoController', [])
.controller('mainController', ['$scope', '$http', 'Todos', function($scope, $http, Todos) {
$scope.formData = {};
Todos.get()
.success(function(data) {
$scope.todos = data;
});
$scope.createTodo = function() {
if ($scope.formData !== null) {
Todos.create($scope.formData)
.success(function(data) {
$scope.formData = {};
$scope.todos = data;
});
}
};
$scope.deleteTodo = function(id) {
Todos.delete(id)
.success(function(data) {
$scope.todos = data;
});
};
}]);
index.html 上的脚本加载顺序:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.13/angular.min.js"></script>
<script src="js/controllers/main.js"></script>
<script src="js/services/todos.js"</script>
<script src="js/core.js"></script>
谢谢!
新信息:按照 floribon 的建议,我得到了同样的错误,除了不是 "simpleTodo" 加载失败,而是 "todoController" 无法加载。我很感激他的建议,但它仍然没有用。 :( 这是一个 github 仓库,如果你想看的话,他的更改已实施:https://github.com/LeungEnterprises/simpleTodo
由于您的控制器需要解析 Todos
依赖项,因此您需要将服务 todoService
添加到其模块依赖项中:
angular.module('todoController', ['todoService'])
此外,您需要在 main.js
文件之前加载 todos.js
文件(当然它需要前者)
我仔细阅读了我的文件,经过大量实验后我推断出问题是由 HTML 文件引起的。问题是未关闭的脚本标签。
不过,我非常感谢大家的帮助,尤其是@floribon!