angularjs – 角度服务定义:服务或工厂
我是一个有角度的新手,我正在构建一个应用程序,有一件事让我感到困惑的是,有几种方法可以定义服务,我从这个链接中读到更多:
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 有谁能解释一下?谢谢.
你有两个大问题:
>工厂返回语法不正确的对象. 那是, 值可以是函数.但是,你返回{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错误的解决方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |