6

我是一个有角度的新手,我正在构建一个应用程序,真正令我困惑的一件事是有几种定义服务的方法,我从这个链接中阅读了更多内容:How to define service then it似乎没有大的区别定义服务的方法。

但我只是注意到一个我认为不同的区别:

看到我从这里得到的这个服务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;
  };
});

如果我使用下面的“工厂”定义此服务,则一个函数不能调用该服务的其他函数。

app.factory('test', function($timeout, $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");
    }, 2000);
    return deferred.promise;
  },
 };
});

我将在浏览器控制台中得到这个:

[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

谁能解释一下?谢谢。

4

1 回答 1

9

你有两个大问题:

  • 工厂返回一个语法不正确的对象。
  • 变量的javascript范围是功能性的

也就是说,您应该返回一个像{key: value, key: value}

值可以是函数。然而,你回来了{key = value, key = value}

第一次修复:

return { 
    getSomething : function() {...},
    getData : function... 
}

其次,不能调用函数是正常的。看到这个jsfiddle。我嘲笑了一切。您可以调用服务返回的函数之一。但是,当从 getSomething 尝试调用 getData 时,您会得到“未定义”:

app.factory('testSO', function () {
return {
    getSomething: function () {
        console.log('return getsomething');
        getData();
    },

    getData: function () {
        console.log('return getData');
    }...

这与在 jsfiddle中声明工厂函数范围内的所有内容并返回引用相同:

app.factory('testSO', function () {
    var getSomething = function () {
        console.log('return getsomething');
    };
    ...
return {
    getSomething: getSomething,
    ...
}

现在您可以调用本地函数,如jsfiddle 的最终版本所示:

app.factory('testSO', function () {
    var getSomething = function () {
        console.log('return getsomething');
        getData();
    };
...

原始服务中有一些重要的东西:var self = this;. 有些人使用 var that = this。这是 ECMA 错误的解决方法。在原始代码的情况下,它用于“将所有内容放在一个对象中”。函数(恰好是函数的属性) self需要引用才能知道要调用的函数在哪里。在这里自己试试http://jsfiddle.net/Z2MVt/7/

于 2013-07-03T13:59:31.403 回答