AngularJS服务在单独的文件中

Chr*_*ruS 8 javascript model-view-controller project-structure angularjs

我的app.js包含

var app = angular.module('myApp', []).
config(['$routeProvider', function ($routeProvider, $http) {
    ...
}]);
Run Code Online (Sandbox Code Playgroud)

服务看起来像

app.service('MyService', function () {
    addNums = function (text) {
        return text + "123";
    }
});
Run Code Online (Sandbox Code Playgroud)

在控制器中我有

function adminCtrl ($scope, MyService) {
    $scope.txt = MyService.addNums("abc");
};
Run Code Online (Sandbox Code Playgroud)

它们都在单独的文件中.问题是我收到了错误 Unknown provider: MyServiceProvider <- MyService

看起来我做错了什么.

Mar*_*cok 11

如果您忘记告诉Angular加载myApp模块,可能会发生提供程序错误.例如,你在index.html文件中有这个吗?:

<html ng-app="myApp">
Run Code Online (Sandbox Code Playgroud)

您的服务缺少"这个.":

this.addNums = function(text) {
Run Code Online (Sandbox Code Playgroud)

小提琴.


Angular社区似乎有很多关于何时使用service()vs factory()以及如何正确编码它们的混淆.那么,这是我的简短教程:

service()方法需要一个JavaScript构造函数.许多使用service()的Angular代码示例包含的代码不是构造函数.通常,他们返回一个对象,这种方式违背了使用service()的目的 - 更多关于下面的内容.如果需要创建并返回一个对象,则可以使用factory()代替.通常,只需要构造函数,并且可以使用service().

以下引用来自不同的AngularJS Google Group帖子:

使用factory()和service()之间的主要区别是factory()必须返回一个对象,而service()不返回任何东西,但它必须是一个对象构造函数.

如果您提供的功能构建所需的对象,请使用factory().即,Angular基本上会做
obj = myFactory()
来获取obj.如果您提供的函数是所需对象的构造函数,请使用service().即,Angular将基本上执行
obj = new myService()
来获取/实例化obj.

因此,当人们使用service()并且其代码"返回"一个对象时,由于JavaScript"new"的工作方式,它有点浪费:"new"将首先创建一个全新的JavaScript对象(然后用原型做事) ,然后调用myService()等定义的函数 - 这里我们并不关心的细节),但是因为myService()定义的函数返回自己的对象,"new"做了一个奇怪的出价:它抛弃对象只是花时间创建并返回myService()函数创建的对象,因此"浪费".

引入service()的原因之一是使其易于使用"经典"OO技术,例如将您的服务定义为coffeescript类.

此外,服务的未记录命名约定似乎是camelCase,首字母小写:例如,myService.