【问题标题】:AngularJS: multiple Factory Instances any prototypical inheritanceAngularJS:多个工厂实例任何原型继承
【发布时间】:2016-04-07 13:13:08
【问题描述】:

Plunker(可能在没有我的描述的情况下解释了这个问题)

我的 Angular-App 中有以下构造(另请参阅 Angular Services 以获取参考):

我使用了一个工厂BaseService,它实现了几个功能。我在BaseService.prototype 上定义了这些函数,以便它们稍后公开(也请参阅上面的链接)。

使用 var 关键字声明私有变量。

这个工厂由多个服务实例化,其中每个服务都为初始化提供自己的值。但是工厂仍然是单例的,所以第二次初始化时会覆盖第一个服务使用的私有变量。

是否有防止这种情况的最佳做法?

如果没有 - 您能否提出解决方案(即使需要删除私有变量)?

【问题讨论】:

    标签: javascript angularjs inheritance factory


    【解决方案1】:

    您应该使用this 而不是全局变量updated plunkr

    【讨论】:

    • 在构造函数中,我将this 存储到变量service 中,因为this 在其他对象、嵌套函数或angular.forEach 循环中使用时引用了错误的上下文。显然这并不能解决我的问题,因为在下一次构造函数调用之后,service 变量也指向了错误的位置。当我既不能通过this 访问上下文,也不能将上下文存储在变量中时,如何可靠地调用工厂的函数?
    • @HW 我不知道你到底想表达什么,但循环工作正常,请参阅这个 plunkr:plnkr.co/edit/56oXXvl75zH4mTfAqMsd?p=preview,angular.forEach 和 ngRepeat 工作正常
    • 我在不同的上下文中使用了angular.foreach(您可以将上下文作为第三个参数传递)。因此,在工厂内但在不同的上下文中使用 angular.foreach 会阻止我调用工厂的函数。虽然没有必要,我可以重写我的代码 - 无论如何似乎都是不好的风格:)
    【解决方案2】:

    您可以保留一个静态私有变量,其中包含每个工厂实例的私有数据。当工厂被实例化时,它的实例被分配了一个唯一的 id(也是一个静态私有变量),而这个唯一的 id 也是数据数组的键。

      var privateVars = {};   // has contained private vars for each instance
      var baseServiceId=0;    // unique id assigned to each instance
    
      var BaseService = function(initval){
        this.baseServiceId = ++baseServiceId;
        privateVars[this.baseServiceId] = {"storedVal":initval};
      };
    
      BaseService.prototype.plusone = function(){
        pv = privateVars[this.baseServiceId].storedVal;
        privateVars[this.baseServiceId].storedVal = pv+1;
      };
      BaseService.prototype.getVal = function(){
        return privateVars[this.baseServiceId].storedVal;
      };
    

    这是更新的 plunkr:http://plnkr.co/edit/56oXXvl75zH4mTfAqMsd?p=preview

    【讨论】:

    • 似乎有点老套,但我喜欢它。比没有私有变量要好得多;)
    • 大声笑,这有点 hacky,尤其适合您的使用。我在创建一个工厂时想出了它,我打算将它也用作可搜索的缓存。我实际上并不需要将数据保密,我只需要一种搜索​​所有实例的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多