我app.js包含
var app = angular.module('myApp', []).
config(['$routeProvider', function ($routeProvider, $http) {
...
}]);
服务看起来像
app.service('MyService', function () {
addNums = function (text) {
return text + "123";
}
});
而在位指示我有
function adminCtrl ($scope, MyService) {
$scope.txt = MyService.addNums("abc");
};
他们都在不同的文件。 问题是,我得到一个错误Unknown provider: MyServiceProvider <- MyService
看起来像我做错了什么。
如果你忘了告诉角加载您对myApp模块可能会出现提供程序错误。 例如,你在你的index.html文件有这个?:
<html ng-app="myApp">
您的服务缺少“这一点。”:
this.addNums = function(text) {
小提琴 。
似乎是在角社区有很多困惑的有关何时使用VS工厂服务()(),以及如何正确地进行编码。 所以,这里是我的简短的教程:
该service()方法需要一个JavaScript构造函数 。 使用服务的许多角代码示例()包含的代码是不是一个构造函数。 通常情况下,他们返回一个对象,哪一种违背了使用服务()的目的 - 更多低于。 如果一个对象需要被创建并返回,然后工厂()可以被代替使用。 通常情况下,一个构造函数是所有必要的,()可以使用的服务。
下面的报价是来自不同AngularJS谷歌集团的帖子:
利用工厂()与服务()之间的主要区别是,工厂()必须返回一个对象,而服务()不返回任何东西,但它必须是一个对象构造函数。
使用工厂()如果您提供的功能,建立您想要的对象。 即,角将主要做
OBJ = myFactory()
获得obj的。 使用服务()如果您提供的功能是你想要的对象的构造。 即,角将主要做
OBJ =新为myService()
获取/实例obj的。
所以,当人们使用服务()和它的代码“返回” S的对象,这是一种由于的方式JavaScript的“新”工程的浪费:“新”将首先创建一个全新的JavaScript对象(当时做的东西有原型,然后调用由为myService(定义函数),等等 - 我们并不真正关心在这里)的详细信息,但是因为为myService()定义的函数将返回自己的对象,“新”做了一个奇怪的投标:它扔掉的对象只是花费的时间创建并返回该为myService()函数创建的对象,因而有“浪费”。
其中之一即服务()中引入的一个原因是,可以很容易用“经典”面向对象的技术,如定义您的服务作为CoffeeScript的类。
此外,对服务的无证命名惯例似乎与小写的首字母进行首字母大写:例如,为myService。
您需要在app.service回调返回addNums。
app.service('MyService', function () {
addNums = function (text) {
return text + "123";
}
return addNums;
});
现在,只要您使用的MyService,角会给你回addNums函数中使用。
因此,你应该在你的控制器使用它,像这样(注意,不是addNums调用):
function adminCtrl ($scope, MyService) {
$scope.txt = MyService("abc");
};
只是作为一个补充澄清Brian的回答,如果你想仍然有你的代码调用MyService.addNums你可以使用以下命令:
app.service('MyService', function() {
var result = {};
result.addNums = function (text) {
return text + "123";
};
return result;
});
然后,你仍然可以使用
MyService.addNums("abc");
如果你想这样做。