通过工厂在角度中实例化对象的正确方法是什么?

时间:2015-09-20 11:58:43

标签: angularjs oop

我最近阅读了Angular Style Guide,我仍然想知道实例化像这样的对象的好方法是什么:

Tracker = function(data){
  key: data.key,
  name: data.name,
  buckets: data.buckets,
  enable: data.enable || false,
  geoip: data.geoip || false
}

我的目标是尊重脱钩的原则。我不想在我的控制器中有任何new Tracker()

基于Angular Style Guide我使用工厂将我的控制器与类跟踪器分离。这是我的工厂。

  angular
  .module('ranger')
  .factory('factoryTracker', factoryTracker);

factoryTracker.$inject = ['$anyInjetable'];

function factoryTracker($anyInjetable) {
  var factory = {
    instantiate: instantiate
  };

  return factory;
  ///////////

  function instantiate(data){
    return {
      //Properties
      key: data.key,
      name: data.name,
      buckets: data.buckets,
      enable: data.enable || false,
      geoip: data.geoip || false
      //Methods
      helloWorld: helloWorld
    };
  }

  function helloWorld(){
      return "I come in peace";
  }
}

在我的控制器中,我使用它:

factoryTracker.instantiate({
                key: tracker._id,
                name: tracker.name,
                enable: false
            });

我的问题是声明我的Tracker对象的方式:

  • 没有真正声明,我们只看到实现

  • 不易阅读

  • 实现的方法在对象闭包之外......

  • 最重要的是:如果我想将类切换为实例化,那么我不想在工厂中编写它。

关于使用工厂和放置模型的几个来源,我谈到了这个问题。但我现在的代码不行。

有任何建议吗?

1 个答案:

答案 0 :(得分:0)

关于@Chandermani提供的链接,这是我的最终代码。清晰,网络,可读。

angular
  .module('ranger')
  .factory('factoryTracker', factoryTracker);

    factoryTracker.$inject = ['$q'];

    function factoryTracker($q) {

        /**
        * Constructor, with class name
        */
        function Tracker(data) {
          // Public properties, assigned to the instance ('this')
          this.key = data.key;
          this.name = data.name;
          this.buckets = data.buckets;
          this.enable = data.enable;
          this.geoip = data.geoip;
        }

        /**
        * Public method, assigned to prototype
        */
        Tracker.prototype.helloWorld = function () {
          return "I come in peace";
        };

        /**
        * Static method, assigned to class
        * Instance ('this') is not available in static context
        */
        Tracker.build = function (data) {
          return new Tracker(data);
        };

        return Tracker;
    }