Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单独文件中的AngularJS服务_Javascript_Model View Controller_Angularjs_Project Structure - Fatal编程技术网

Javascript 单独文件中的AngularJS服务

Javascript 单独文件中的AngularJS服务,javascript,model-view-controller,angularjs,project-structure,Javascript,Model View Controller,Angularjs,Project Structure,我的app.js包含 var app = angular.module('myApp', []). config(['$routeProvider', function ($routeProvider, $http) { ... }]); 服务看起来像 app.service('MyService', function () { addNums = function (text) { return text + "123"; } }); 在康托勒我有

我的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");
};
它们都在不同的文件中。问题是我犯了一个错误
未知提供程序:MyServiceProvider您需要在app.service callback中返回addNums

app.service('MyService', function () {
  addNums = function (text) {
    return text + "123";
  }
  return addNums;
});
现在,无论何时使用MyService,angular都会返回addNums函数供您使用

因此,您应该像这样在控制器中使用它(注意没有addNums调用):


作为对Brian答案的补充说明,如果您仍希望代码调用MyService.addNums,您可以使用以下方法:

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

    return result;
});
那你还可以用

MyService.addNums("abc");
如果你想这么做的话。

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

<html ng-app="myApp">


在Angular社区中,关于何时使用service()和factory()以及如何正确编码它们,似乎有很多困惑。下面是我的简短教程:

这家公司期待着一个新的机会。许多使用service()的代码示例包含的代码不是构造函数。通常,它们返回一个对象,这有点违背了使用service()的目的-下面将详细介绍。如果需要创建并返回对象,则可以使用factory()。通常,只需要一个构造函数,就可以使用service()

下面的引文来自AngularJS Google Group的不同帖子:

使用factory()与使用service()的主要区别在于factory() 必须返回一个对象,而service()只返回它 必须是对象构造函数

如果所提供的函数生成所需的对象,请使用factory() 希望也就是说,角度基本上可以
obj=myFactory()
为了得到obj。如果您提供的函数是 所需对象的构造函数。也就是说,角度基本上可以
obj=newmyservice()
获取/实例化obj

因此,当人们使用service()及其代码“return”是一个对象时,这是一种浪费,因为JavaScript“new”的工作方式是:“new”将首先创建一个全新的JavaScript对象(然后使用prototype进行处理,然后调用myService()定义的函数,等等——这里并不真正关心细节),但是由于myService()定义的函数返回它自己的对象,“new”做了一些奇怪的事情:它丢弃了只花时间创建的对象,并返回myService()函数创建的对象,因此是“浪费”

引入service()的原因之一是为了简化它 使用“经典”OO技术,例如将服务定义为 咖啡脚本类


此外,服务的未记录命名约定似乎是大写的,第一个字母小写:例如myService。

service()不应该真正返回任何内容——它应该定义一个构造函数(如果有兴趣,请参阅我的答案了解更多信息)。最终决定使用
factory
。小提琴没有显示如何在问题中提出的单独文件中定义服务。引入service()的原因之一是为了便于使用“经典”OO技术,例如将服务定义为coffeescript类。这似乎是在描述
factory()
而不是
service()
,因为当您使用前者时,您应该自己构造对象,因此您有机会使用您想要的任何类。如果需要创建并返回对象,您可以自己编写,然后可以使用factory()。(强调我的)。你应该使用
this.addNums=function(text)
而不是
addNums=function(text)
<html ng-app="myApp">
this.addNums = function(text) {