3

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'

thenの値を調べてみるとthis...まあ、オブジェクト自体の値ですnameなどxAxisFormatter...

どうすればこれにアプローチできますか?これは正しい方法ですか?

4

1 に答える 1

3

thisinのコンテキストchartParsingHelpers.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;
 }]);

そうすれば、常にそのオブジェクトを参照していることを確認できます。

于 2013-09-13T08:41:45.353 に答える