AngularJS - 以角度声明服务的不同方式有哪些主要区别?

时间:2013-07-29 20:13:07

标签: angularjs angularjs-directive

我正在开发一个angularJS应用程序,我正在努力坚持AngularJs中最有效和广泛接受的开发风格。 目前,我正在使用这种方式声明我的服务:

app.factory('MyService', function() {
  /* ... */
  function doSomething(){
     console.log('I just did something');

  }

  function iAmNotVisible(){
      console.log('I am not accessible from the outside');
  }
  /* ... */

  return{
     doSomething: doSomething
  };
});

然而,有很多例子,我不太确定要采用哪种设计风格。对服务有广泛了解的人能否解释为什么某种风格比另一种风格更具相关性?

除了限制对我服务中某些功能的访问外,我在做什么有用吗?

3 个答案:

答案 0 :(得分:6)

我建议您在angular-seed app中对factoryservice进行布局,但应用程序只会在value样板中使用services.js 。但是,您可以调整它们用于控制器,指令和过滤器的布局。

'use strict';

/* Filters */

angular.module('myApp.filters', []).
  filter('interpolate', ['version', function(version) {
    return function(text) {
      return String(text).replace(/\%VERSION\%/mg, version);
    }
  }]);

对于您将要执行的服务意味着什么:

'use strict';

/* Services */

angular.module('myApp.filters', []).
  service('myservice', ['provider1', 'provider2', function(provider1, provider2) {
      this.foo = function() { 
          return 'foo'; 
      };
  }]).
  factory('myfactoryprovider', ['myservice', function(myservice) {
       return "whatever";
  }]);

这比你绝对需要的更多样板,但它是安全的缩小并保持你的命名空间清洁。

您要做的就是决定constvaluefactoryservice中哪一个最合适。如果要创建单个对象,请使用service:它将作为构造函数调用,因此您只需将任何方法分配给this,所有内容都将共享同一个对象。如果要完全控制是否创建了对象,尽管它仍然只调用一次,请使用factory。使用value返回一个简单值,使用const表示可以在config中使用的值。

答案 1 :(得分:0)

我不相信有一个公认的标准,但我自己也遵循这个惯例:

var myServiceFn = function (rootScope, http) { ... };
...
app.factory('MyService', ['$rootScope', '$http', myServiceFn]);

我觉得这比定义内联函数更清晰,如果我决定缩小我的文件,也允许正确注入。 (见http://docs.angularjs.org/tutorial/step_05)。

答案 2 :(得分:0)

作为一个例子,我一直在模块中定义服务:

angular.module('userModule', [])
  .service('userService', function() {
    this.user = null;

    this.getUser = function() {
      return this.user;
    };

    this.userIsNull = function() {
      return (this.user === null);
    };

    this.signout = function() {
      this.user = null;
    };
  })

我认为使用.service而不是.factory?

更清楚