d3从同一个函数设置多个属性?

时间:2017-06-14 23:23:00

标签: javascript d3.js

有没有办法从同一个函数设置多个属性?

export function receiveWines(wines) {
  return {
    type: 'FETCH_WINES_SUCCESS',
    wines
  };
}

export function fetchWines() {
  return function(dispatch) {

    return fetch(`https://sb-challenge-provo17.c9users.io/api/v1/wines`)
      .then(response => {
        var resp = response.json(); 
        return resp;
      })

      .then(json => {
        dispatch(receiveWines(json.wines)
      );
      });
  };
}

我想同时计算d3.selectAll('.myshape') .attr('y',function(d,i) { ... calculates something ... }) .attr('height',function(d,i) { ... calculates something very similar... }) y1,然后设置y2y = y1。但是在d3中执行此操作的标准方法似乎是每个属性具有单独的功能。还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,那么您需要进行密集计算,只想计算一次每个元素,无论您设置的属性数量是多少。

在这种情况下,如果您需要,可以使用each传递当前元素(this)以及基准,索引和组:

d3.selectAll(".myShape").each(function(d,i,n){
    //Here you put the complex calculation 
    //which will assign the values of y1 and y2.
    //This calculation runs only once per element
    d3.select(this).attr("y", y1).attr("height", y2 - y1)
});

答案 1 :(得分:0)

不完全是。但是你可以间接地解决这个问题。这增加了稍微增加的开销但值得imo。 JS没有很好的“编译时”(就js引擎而言)像C系列那样的宏,它可以在没有运行时成本的情况下为你提供很好的扩展。

像这样(你可能已经知道):

let myshape = d3.selectAll('.myshape')

['y', 'height', ...].forEach(attr => myshape.attr(attr, calcAttr));

function calcAttr(a, i) {
    // shared code

    switch (a) {
    case 'y':
        //attr specific
        break;
    }
}