在Angular指令中使用$ filter

Mat*_*nis 16 javascript d3.js angularjs

我已经构建了一个Angular指令来显示D3可视化.我在y轴上$filtertickFormat函数中使用如下:

ySalesAxis = d3.svg.axis()
  .orient('left')
  .ticks(6)
  .scale(ySalesScale)
  .tickFormat(function(d) {
    return $filter('formatSalesValue')(d.value, 'USD');
  });
Run Code Online (Sandbox Code Playgroud)

我看到的问题是,当页面首次加载时,这些刻度标签都不会出现.确实,如果我console.log($filter('formatSalesValue')(d.value, 'USD'))得到6 undefined(因为我的ticks财产设置为6).但是,一旦我执行操作,例如在画笔过滤器内单击,标签标签就会显示格式正确.

在此输入图像描述

我的formatSalesValue过滤器调用服务(异步操作),因为有许多货币循环进出系统,我从数据库中检索的详细信息.我确定这是我的tick标签未定义的原因.我该怎么做才能确保在页面加载后立即显示这些值?注意:我试图tickFormat在调用中包装我的函数scope.$apply但是我收到digest already in progress错误.

m1g*_*u3l 8

Axis的tickFormat方法运行传递回调并使用它以同步方式返回的值.这就是你在第一次调用时未定义的原因,因为你的$ filter是异步的.

如果此异步调用仅出于性能原因,则应使其同步并在其他位置寻找改进.如果有角度观察这么多独立的变化,它可能会因$ digest周期而受阻.

如果你制作JSBin我可能会告诉你更多.