在单独的文件AngularJS服务(AngularJS service in separate fi

2019-08-02 18:49发布

我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

看起来像我做错了什么。

Answer 1:

如果你忘了告诉角加载您对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。



Answer 2:

您需要在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");
};


Answer 3:

只是作为一个补充澄清Brian的回答,如果你想仍然有你的代码调用MyService.addNums你可以使用以下命令:

app.service('MyService', function() {
    var result = {};
    result.addNums = function (text) {
        return text + "123";
    };

    return result;
});

然后,你仍然可以使用

MyService.addNums("abc");

如果你想这样做。



文章来源: AngularJS service in separate file