2015-07-08 7 views
1

У меня есть случай, когда мне нужно использовать несколько версий библиотеки Nvd3 для разных диаграмм на одной странице в угловом приложении (каждый график загружается через отдельный шаблон). Как избежать такого столкновения?Как использовать две версии одной и той же библиотеки javascript без функции кровопускания на одной странице?

Итак, предположим, что для графа partial_1.html требуется v1.8, график на partial_2.html требует v1.1 и т. Д. Любая помощь будет высоко оценен.

jQuery пытается исправить это с помощью метода noConflict, но я не могу найти решение, которое работает для произвольных js-библиотек (а не только jQuery).

+5

Мой совет: обновить устаревшую диаграмму :) –

+0

Вот еще один совет, чтобы избежать этого в будущем: всегда всегда псевдоним всех вызовов сторонних функций. –

+0

Обновление диаграммы не является вариантом, так как более новая версия Scatterplot не имеет увеличения «рыбий глаз» по причинам, не зависящим от моего понимания, и переопределение других - это не вариант, потому что мне нужны некоторые из более новых версий. :) @JaredSmith Что вы подразумеваете под псевдонимами третьих лиц? Не могли бы вы привести пример? :) –

ответ

3

Если вы не можете обновлять старые диаграммы, чтобы использовать самую последнюю версию, то у вас есть только один параметр, и вы должны переименовать глобальную переменную «d3» для каждой используемой вами версии. Затем вы должны найти и заменить на каждом шаблоне для изменения ссылочных переменных. Таким образом, каждый указывает на определенную версию. Вы можете сделать это с кодом, который выглядит примерно так:

(function (w, d) { 
    "use strict"; 
    var h = d.getElementsByTagName("head")[0], 
     s = d.createElement("script"); 
    w.d3 = null; 
    s.src = "https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.min.js"; 
    s.onload = function() { 
     w.d3_3_5_3 = w.d3; 
     w.d3 = undefined; 
     s = d.createElement("script"); 
     s.src = "https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.4/d3.min.js"; 
     s.onload = function() { 
      w.d3_3_5_4 = w.d3; 
      w.d3 = undefined; 
      s = d.createElement("script"); 
      s.src = "https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"; 
      s.onload = function() { 
       w.d3_3_5_5 = w.d3; 
       w.d3 = undefined; 
      }; 
      h.appendChild(s); 
     }; 
     h.appendChild(s); 
    }; 
    h.appendChild(s); 
}(window, document)); 

В приведенном выше примере нагрузок три версии, и с помощью события загрузки, он улавливает каждый новый экземпляр d3 и помещает его в свой переменном. В этом случае d3_3_5_3, d3_3_5_4 и d3_3_5_5

+1

Спасибо за ответ. Я перешел на новую версию диаграмм и сделал свою собственную функцию масштабирования с помощью 'd3.zoom()', которую я теперь могу использовать на любой диаграмме nvd3. :) –

Смежные вопросы