我是一个有角度的新手,我正在构建一个应用程序,有一件事让我感到困惑的是,有几种方法可以定义服务,我从这个链接中读到更多:
How to define service
那么似乎定义服务的方式没有太大的区别.
那么似乎定义服务的方式没有太大的区别.
但我刚才注意到一个与众不同的区别:
看到我从这里得到的这项服务http://jsfiddle.net/2by3X/5/
var app = angular.module('myApp',[]); app.service('test',function($timeout,$q) { var self = this; this.getSomething = function() { return self.getData().then(function(data) { return self.compactData(data); }); }; this.getData = function() { var deferred = $q.defer(); $timeout(function() { deferred.resolve("foo"); },2000); return deferred.promise; }; this.compactData = function(data) { var deferred = $q.defer(); console.log(data); $timeout(function() { deferred.resolve("bar"); },2000); return deferred.promise; }; });
如果我使用“factory”定义此服务,如下所示,一个函数不能调用该服务的其他功能.
app.factory('test',$q) { return { getSomething : function() { return getData().then(function(data) { return compactData(data); }); },getData : function() { var deferred = $q.defer(); $timeout(function() { deferred.resolve("foo"); },2000); return deferred.promise; },compactData : function(data) { var deferred = $q.defer(); console.log(data); $timeout(function() { deferred.resolve("bar"); },}; });
我将在浏览器控制台中获取此信息:
[08:41:13.701] "Error: getData is not defined .getSomething@http://fiddle.jshell.net/_display/:47 Ctrl1@http://fiddle.jshell.net/_display/:75 invoke@http://code.angularjs.org/1.0.0/angular-1.0.0.js:2795 instantiate@http://code.angularjs.org/1.0.0/angular-1.0.0.js:2805
有谁能解释一下?谢谢.
你有两个大问题:
>工厂返回语法不正确的对象.
> javascript变量范围是有效的
那是,
你应该返回一个像{key:value,key:value}这样的对象
值可以是函数.但是,你返回{key = value,key = value}
第一个修复:
return { getSomething : function() {...},getData : function... }
其次,无法调用函数是正常的.看到这个jsfiddle.我嘲笑了一切.您可以调用服务返回的其中一个函数.但是,当从getSomething尝试调用getData时,您会得到“undefined”:
app.factory('testSO',function () { return { getSomething: function () { console.log('return getsomething'); getData(); },getData: function () { console.log('return getData'); }...
这与在工厂函数范围内声明所有内容并返回引用see in jsfiddle相同:
app.factory('testSO',function () { var getSomething = function () { console.log('return getsomething'); }; ... return { getSomething: getSomething,... }
现在您可以调用本地函数,如final version of the jsfiddle所示:
app.factory('testSO',function () { var getSomething = function () { console.log('return getsomething'); getData(); }; ...
原始服务中有一些重要的东西:var self = this; .有些人使用var that = this.这是ECMA错误的解决方法.
在原始代码的情况下,它用于“将所有内容放在一个对象中”.自我中的函数(恰好是函数的属性)需要一个引用来知道要调用的函数的位置.自己动手http://jsfiddle.net/Z2MVt/7/