3

我正在开发一个 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
  };
});

然而,那里有很多例子,我不太确定要遵循哪种设计风格。对服务有广泛了解的人能否解释某种风格比另一种风格更相关的原因?

除了限制对我服务中某些功能的访问之外,我正在做的事情是否有用?

4

3 回答 3

6

我建议你像他们在angular-seed appfactory中那样布局你的or ,除了那个 app 烦人地只在样板文件中使用。但是,您可以调整它们用于控制器、指令和过滤器的布局。servicevalueservices.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";
  }]);

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

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

于 2013-07-30T09:59:56.893 回答
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 更清楚?

于 2013-07-30T02:42:31.160 回答
0

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

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

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

于 2013-07-29T20:20:08.017 回答