AngularJS中工厂内的JavaScript范围

时间:2013-09-13 08:32:05

标签: javascript angularjs scope angularjs-factory

我有一些令人头疼的范围,而不是Angular范围,但JavaScript本身。

我有factory名为chartParsingHelpers,就像这样:

angular.module('myApp')
  .factory('chartParsingHelpers',['dateUtils', function(dateUtils){
    return {
      getInitArray : function(){
        return [ 'Stuff', 'Stuff 2' ];
      },
      doFancyStuff : function (data){
        var initArray = this.getInitArray();
      }
    };
  }]);

如果我在任何地方注入chartParsingHelpers并调用doFancyStuff它会起作用,那就行得很好。但是,我想为我的花式图表配置一些配置,因为它们共享代码结构,我认为很好地分享指令和所有朋友的配置,所以,我创建了这样的东西:

angular.module('visits')
  .factory('ChartTypes',['dateUtils', 'chartParsingHelpers', function(dateUtils, chartParsingHelpers){
    return {
      config : [
        {
          name : 'Chart 1',          
          xAxisFormatter : dateUtils.getFullHour,
          parseMethod : chartParsingHelpers.doFancyStuff
        }
      ]
    };
  }]);

我的计划是将ChartTypes注入Controller并转换为指令(暂时)但我收到此错误:

TypeError: Object #<Object> has no method 'getInitArray'

如果我查看this的值,那么......好吧,它是namexAxisFormatter等对象本身的价值......

我怎么能接近这个?这是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

thischartParsingHelpers.doFancyStuff的上下文可能就是问题所在。我会像这样创建工厂:

angular.module('myApp')
  .factory('chartParsingHelpers',['dateUtils', function(dateUtils){

    var self = {};

    self.getInitArray = function() {
      return ['Stuff', 'Stuff 2'];
    };

    self.doFancyStuff = function(data) {
      var initArray = self.getInitArray();
    };

    return self;
 }]);

这样你就可以确保你总是引用那个对象。