Как вытащить срез, но отключить дальнейшие изменения среза

1

Вырезание фрагментов можно легко переключить, как все или ни одного. Я ищу способ вырезать кусочек, но не разрешаю дальнейший кусочек.

Пример: http://jsfiddle.net/4zg3hmn8/1/

Добавление слушателя в clickSlice которое предотвращает по умолчанию, останавливает распространение или возвращает false, не работает: событие clickSlice запускается до запуска этих подчиненных событий.

С clickSlice прослушивателя clickSlice: http://jsfiddle.net/4zg3hmn8/2/

Больше копания показывает, что инициируемое событие - это mouseup который, в свою очередь, вызывает метод clickSlice объясняющий поведение подчиненного события. К сожалению, добавление слушателя в mouseup вообще не повлияло на диаграмму.

С прослушивателем mouseup: http://jsfiddle.net/4zg3hmn8/3/

Событие добавляется в частный javascript-объект, а не в элемент DOM, поэтому мне не удалось выяснить способ удаления с помощью Javascript (он легко удаляется с помощью инструментов Chrome dev).

Итак, как решить?

Теги:
amcharts

2 ответа

1

Переопределение недокументированных внутренних методов и событий не рекомендуется, так как это может привести к неопределенному поведению. Если вы хотите сохранить только кусочек по умолчанию вытащил, вы можете использовать clickSlice событие для вызова clickSlice снова, отменяя пользователь начального щелчок. Вам нужно будет установить настраиваемое свойство, чтобы сообщить событию игнорировать вызов clickSlice вручную:

  "listeners": [{
    event: 'clickSlice',
    method: function(e) {
      if (!e.dataItem.ignore) {
        e.dataItem.ignore = true; //prevent infinite loop
        e.chart.clickSlice(e.dataItem.index); //call clickSlice to cancel out the user click
        e.dataItem.ignore = false; //reset the ignore flag
      }
    },
  }],

Обновленная скрипка: http://jsfiddle.net/4zg3hmn8/5/

  • 0
    отличный момент. немного дополнительных накладных расходов, чтобы избежать будущей поломки - это выгодная сделка.
1

Когда AmCharts.makeChart называется переданным объектом конфигурации, он используется для расширения базы данных по умолчанию. Манипулируя этим, мы можем передать копию метода addEventListener, используемого в базовом объекте, и эффективно перезаписать его, удалив часть, которую мы не хотим:

...
"startDuration": 0,
"valueField": "litres",
"titleField": "country",
"pulledField": "isPulled",
"balloon": {
   "fixedPosition": true
},
"addEventListeners": function(a, b) {
   var c = this
   a.mouseover(function(a) {
      c.rollOverSlice(b, !0, a)
   }).mouseout(function(a) {
      c.rollOutSlice(b, a)
   }).touchend(function(a) {
      c.rollOverSlice(b, a)
   }).mouseup(function(a) {
      alert('ah ah ah... didn\'t say the magic word!')
   }).contextmenu(function(a) {
      c.handleRightClick(b, a)
   })
},
...

С прослушивателем mouseup: http://jsfiddle.net/4zg3hmn8/4/

  • 0
    Переопределение внутренних методов просто запрашивает случайное неопределенное поведение / разрыв по линии, особенно если внутренние addEventListeners меняются, чтобы ожидать, что во внутреннем методе addEventListeners произойдет что-то еще, что ваш обходной путь не addEventListeners . Посмотрите мой пример для более безопасного способа выполнить вашу задачу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню