0

是否可以在下面使用此代码并使其易于重复使用,而无需每次我想创建新选项时复制和粘贴:

optionA: {
  chart: {
    type: 'stacked',
    color: 'red',
    showControls: false
  }
}

现在,如果我想要另一个图表,我必须立即执行此操作:

optionB: {
  chart: {
    type: 'line',
    color: 'yellow',
    showControls: false
  }
}

如果有一种方法可以创建一个类或类似的东西,那就太好了,这样我就可以添加一个新选项而不必重用所有相同的代码,有点像隐藏不需要为实现而知道的所有内容. 我四处寻找方法来做到这一点,但我的搜索没有成功。

编辑:到目前为止,在查看回复后,我可能没有足够的信息。这是完整的数据:

timelineA: {
    chart: {
        type: 'stackedAreaChart',
        color: defaultColor,
        showControls: false,
        showLegend: false,
        useInteractiveGuideline: true,
        margin: margin,

        x: AnalysisTransforms.xValue,
        y: function(d){
            return d[1];
        },

        forceY: [0, 1],

        noData: $scope.translations.noData,
        xAxis: {
            showMaxMin: false,
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatDate,
            tickValues: AnalysisTransforms.xAxisTicks
        },
        yAxis: {
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatInteger
        }
    }
}

timelineB: {
    chart: {
        type: 'line',
        color: defaultColor,
        showControls: false,
        showLegend: false,
        useInteractiveGuideline: true,
        margin: margin,

        x: AnalysisTransforms.formatLine,
        y: AnalysisTransforms.linex,

        noData: $scope.translations.noData,
        xAxis: {
            showMaxMin: false,
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatParseDate,
            tickValues: AnalysisTransforms.xticks
        },
        yAxis: {
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatInteger
        }
    }
}

这是来自 angular-nvd3 并且回购没有足够的支持让我解决这个问题。我已经开始为此创建一个类,但我认为我没有遵循最佳实践,因为我不知道如何将这样的对象文字转换为我可以为我想要创建的任何图表新建的类。

我看到的是在 2 之间使用了一些代码,然后一些不是。我希望我不会在这个问题上寻求帮助的能力之外感到困惑。

4

3 回答 3

1

比如:

var defaults = {
  color: defaultColor,
  showControls: false,
  showLegend: false,
  useInteractiveGuideline: true,
};

function buildChart(type, opts) {
  return Object.assign({
    type: type,
  },
  defaults,
  opts);
}

// Then you can do variations as 
var lineChart = buildChart('line', { color: '#CCC' });
var barChart = buildChart('bar', { color: 'red' });

Object.assign最后一个很重要opts,因此它可以在defaults需要时覆盖。

于 2016-09-02T21:11:24.140 回答
0

是的,您可以轻松地创建对象……如果您在最近的浏览器上工作,有一种更好的方法可以做到这一点。但这只是一个让你开始的样本

var Option = (function ()
{
     var Class = function (Type, Color)
     {
        this.chart = {
        type: Type,
        color: Color,
        showControls: false
      };
};

    (Class.prototype);
    return Class;
})();

var optionA = new Option('stacked', 'red');
var optionB = new Option('line', 'yellow');

这里有一个小提琴

于 2016-09-02T20:33:25.300 回答
0
  function getObj(opts) {
     return {
        type: opts.type,
        colour: opts.colour,
        showControls: opts.showControls
     }
  }

  var b = getObj({type: 'sometype'})

如果需要,您可以添加一些默认值,但以上应该可以

于 2016-09-02T20:09:13.363 回答