2015-08-20 35 views
5

Noktalardan birine tıkladığımda grafiğin güncellenmesine neden olur. Bu yalnızca, <nvd3> öğesinde bir ngClick yönergesine sahip olsaydım (dinleyici işlevi hiçbir şey yapmasa bile) olur. ngClick'u kaldırırsam her şey yolunda.ngClick D3 grafiğinin yeniden çizilmesine neden olur

angular-nvd3 ile oldukça basit bir nvd3 dağılım grafiğini kullanıyorum.

Bu garip etkileşime ne neden olabilir? İşte

Clicking points on a graph

sorunu yeniden üreten bir plunker var

(görmek zor ama grafik her bir tıklama yeniden çizilir, üst dahil olmak üzere bu yüzden bu kaydın görüntüyü, düşük):

http://plnkr.co/edit/F0ZslBaisoHWIp0VcI8o

teşekkürler!

UPDATE Angular-nvd3 içinde bir saatin içine daraltdım. Bir şekilde ngClick'in varlığı 'verilerin' değişmesine neden oluyor. Bu satır yenilemeyi tetikliyor: https://github.com/krispo/angular-nvd3/blob/master/dist/angular-nvd3.js#L328 Kodumda 'verileri' değiştiren hiçbir şey yok (ayrıca nesnenin yönerge dışında aynı örnek olduğunu doğruladı) ve angular-nvd3.js'de görebileceğim hiçbir şey yok. veri hiç ... hmmm ...

GÜNCELLEME İşte benim click olayı dinleyicisi (boş oluyor) var:

controller.handleChartClick = function(event) { 
}; 

ve html:

<div class="col-sm-10"> 
    <nvd3 ng-click="observationsCharts.handleChartClick($event)" 
       options="observationsCharts.scatterPlotChartOptions" 
       data="observationsCharts.scatterPlotChartData"></nvd3> 
</div> 
+0

ng tıklatarak ne arıyorsunuz? – Terafor

+0

Verileriniz plunkr ile tam olarak aynı mı? Sorun, örnekte çoğaltılmıyorsa kodunuzda farklı bir şey olmalıdır. Gerçek kodunuzu gönderir misiniz? –

+0

@StaceyBurns, Soruyu ve plunker'ı güncelledim, lütfen bir göz atın. Artık sorunu yeniden üretiyor ve aynı zamanda üretim kodumda kullandığım bazı veriler var. Diğer farklılıklar: Ben plunker (plunker eski sürümleri kullanıyordum ve fark etmedim) d3, nvd3 ve angular-nvd3 sürümlerini güncelledim ve aynı zamanda asgari koda kadar sıyrıldı. – HankScorpio

cevap

2

Aşağıdaki izle soruna neden olduğunu doğru: Eğer eski ve yeni veri, veri aslında değişiyor ne olduğunu görmek için bu işlevde bir günlük eklerseniz

// Watching on data changing 
scope.$watch('data', function (newData, oldData) { 
    if (newData !== oldData && scope.chart) { 

    if (!scope._config.disabled && scope._config.autorefresh) { 
     scope._config.refreshDataOnly && scope.chart.update ? scope.chart.update() : scope.api.refresh(); // if wanted to refresh data only, use chart.update method, otherwise use full refresh. 
          } 
         } 
        }, scope._config.deepWatchData); 

şey vardır.

Noktalardan birine tıkladığınızda, nvd3 verilere bir renk özelliği ekliyor.

eski veriler:

[{"key":"Battery Voltage","values":[{"x":1439419440000,"y":90,"series":0},{"x":1439419440000,"y":43,"series":0},{"x":1439419440000,"y":345,"series":0},{"x":1439167620000,"y":73,"series":0},{"x":1439167620000,"y":42,"series":0},{"x":1439167620000,"y":36,"series":0},{"x":1440010740000,"y":32,"series":0},{"x":1439419440000,"y":62,"series":0},{"x":1439167620000,"y":73,"series":0},{"x":1439167620000,"y":42,"series":0},{"x":1439167620000,"y":36,"series":0}]}] 

yeni veriler:

[{"key":"Battery Voltage","values":[{"x":1439419440000,"y":90,"series":0,"color":"#1f77b4"},{"x":1439419440000,"y":43,"series":0,"color":"#1f77b4"},{"x":1439419440000,"y":345,"series":0},{"x":1439167620000,"y":73,"series":0},{"x":1439167620000,"y":42,"series":0},{"x":1439167620000,"y":36,"series":0},{"x":1440010740000,"y":32,"series":0},{"x":1439419440000,"y":62,"series":0,"color":"#1f77b4"},{"x":1439167620000,"y":73,"series":0},{"x":1439167620000,"y":42,"series":0},{"x":1439167620000,"y":36,"series":0}],"color":"#1f77b4","value":90}] 

yeni noktayı tıklayın her zaman, renk niteliği nesnesine eklenir, yani saat işlevinin aslında doğru çalışıyor.

Ben https://github.com/krispo/angular-nvd3

bir konu üzerinden açılması tavsiye ediyorum ** Düzenleme - Sadece ng tıklama eklendiğinde gerçekleşmeden nedeni bu saati tetikleyeceğini çalıştırmak için döngüsünü sindirmek Açısal zorlar çünkü netleştirmek için .

+0

Tamam, teşekkürler. 'Scope._config.deepWatchData' ile ilgili kısmı gözden kaçırmış gibi görünüyor. Bunu yanlış olarak ayarlamak problemi halleder ... yine de bunu yapmak için idealden daha az gibi hissettirir. – HankScorpio

+0

Evet, en ideal görünmüyor ve bu sadece verileriniz değişmezse çalışacaktır. Örneğin, DeepWatch öğesini false olarak ayarlarsanız ve bunu ng-tıklamanıza eklerseniz: $ scope.data [0] .values ​​[0] .y = 300, grafiği güncellemez. (Doğru olarak ayarlandığında grafiği günceller). –

2

Bunun için tek geçici çözüm (şimdilik), deepWatchData: false yapılandırma ayarını kullanmaktır. Bu, saatin çok sık tetiklenmesini engelliyor.

<nvd3 config="{deepWatchData: false}" options="..." data="..."/>