2017-02-15 64 views
6

Czy można używać D3 z Elm przy użyciu portów? Próbuję Elm, ale nie mogę znaleźć żadnych przykładów użycia Elm z D3 bez otoki API. Problemem, który napotkam, jest to, że wrapper i widły nie działają z wersją 0.18. Widzę też wiele stwierdzeń, które sugerują, że budowanie API wokół API JavaScript jest złą praktyką i że zamiast tego powinieneś używać portów. Nie mogę znaleźć żadnych przykładów tego z D3. Znalazłem this example, ale część D3 została zrobiona w prostym javascript, który nie pasuje.Używanie D3 z Elmem

Prawdopodobnie jestem zbyt agresywny, biorąc na siebie D3 tuż przy kiju z Wiązem, ale to naprawdę chcę z nim zrobić. Jeśli nie jest możliwe używanie D3 z Elmem, prawdopodobnie nie będę się tym przejmował. Czy jest jakiś podstawowy problem z tego rodzaju interakcją, czy jest to po prostu brak zainteresowania D3 w społeczności Elma, czy też po prostu coś mi brakuje?

Na przykład, weźmy ten kod zgrane z przykładu bl.ocks powyżej:

var t = d3.transition().duration(750); 
var g = d3.select("svg g") 
// JOIN new data with old elements. 
var text = g.selectAll("text") 
    .data(data, function(d) { return d; }); 

// ENTER new elements present in new data. 
text.enter().append("text") 
    .attr("class", "enter") 
    .attr("dy", ".35em") 
    .attr("y", -60) 
    .attr("x", function(d, i) { return i * 24; }) 
    .style("fill-opacity", 1e-6) 
    .text(function(d) { return d; }) 
    .transition(t) 
    .attr("y", 0) 
    .style("fill-opacity", 1); 

Czy istnieje tłumaczenie proste w Elm dla tego typu rzeczy?

+1

Oto przykład pracy z portów i dużą bibliotekę JS (Google Maps) http: //simonh1000.github .io/2016/12/elm-ports-google-maps/To może ci pomóc –

+0

@SimonH Dzięki za twoją pomoc. Patrzyłem na pewne rzeczy, ale tam, gdzie walczę, jest to, że d3 używa wielu odniesień do metod. Musisz przekazać mu funkcje i funkcje wywołania, które zwracają funkcje (które są również obiektami). Nie mam pojęcia, jak to zrobić w Elm, więc właśnie tam miałem nadzieję znaleźć działający (prosty) przykład. – JimmyJames

+0

Czy możesz podać przykład kodu, który musisz przekazać przez port. Rozwiń pytanie, aby pokazać, do jakiej funkcjonalności chcesz uzyskać dostęp w D3 z Elm –

Odpowiedz

3

Wiem tylko trochę o D3. Będziesz chciał umieścić wszystkie dane w Elm i po prostu przekazać dane do kodu js, który kontroluje D3. To sprawi, że twój model będzie zdrowy.

Należy również uważać na mutację D3 w DOM, ponieważ wtedy Wiąz będzie walczył o aktualizację części strony, za którą jest odpowiedzialny. Najlepiej byłoby wyrzeźbić twoją stronę z częściami wiązy i innymi częściami za pomocą Elm.embed. Ale możesz mieć Elm do napisania całej strony i pozwolić D3 zmutować DOM, jeśli użyjesz Html.keyed, aby pomóc Elmowi śledzić, co jest w DOM.

Html.keyed.div "d3node" 
    [ ] 
    [ ... ensure that d3 only touches DOM elements inside this node ... ] 

Nie można przekazać funkcji jako takich przez port, ale można przekazać json. więc można użyć wiąz, aby stworzyć coś podobnego

{ function_type: "f1", 
    param1: .... 
    param2: ... 
} 

Następnie można w js zrobić

switch (data.function_type) of 
    case "f1: 
    function1 (data.param1, data.param2); 
... 


function1(p1, p2) { 
    // some sort of D3 manipulation 
    var text = g.selectAll(p1) 
    .data(data, p2); 
+0

Czy interakcje z javascriptem w przykładowym kodzie są niemożliwe w Elm? – JimmyJames

+0

Problem polega na tym, że kod, który sugerujesz, mutuje DOM i że _ może zmylić aktualizację DOM Elma. Nie jestem pewien na pewno i pewnie będzie trzeba próbować.Ale używanie klucza pomoże –

+0

OK, to jest pomocne, ale to, czego naprawdę szukam, to pomoc w przekazywaniu funkcji do D3 i odzyskiwaniu funkcji/obiektów z D3 w celu przekazania ich z powrotem do D3. Dokumentacja interop dla Elma, którą znalazłem, wydaje się mówić tylko o prostych interakcjach. Moją preferencją (przynajmniej początkowo) jest wykonanie całej prezentacji z D3. Może obsłużyć dowolne manipulacje DOM, nie tylko SVG itp. – JimmyJames

0

Twój problem może być rozwiązany za pomocą webcomponent jak multi-chart.

importu składnik wewnątrz index.html i utworzyć węzeł z atrybutami, które mają:

Html.node "multi-chart" [ Html.Attributes.attribute "title" "test chart" ] [] 
+0

Nie wiem jak to odpowiada na pytanie. W szczególności nie widzę nic z tym projektem, który odnosi się do Wiązu. – JimmyJames

+0

Co chciałem wskazać, że w większości przypadków najlepszym sposobem na współdziałanie z javascript i Elm nie jest używanie portów, ale używanie komponentów sieciowych. Nauczyłem się od sześciu miesięcy używania Wiązu w aplikacjach produkcyjnych. Proszę sprawdzić tę rozmowę z rtfeldman: https://www.youtube.com/watch?v=ar3TakwE8o0e – Lisard

+0

Chyba nie jestem pewien, w jaki sposób mi to pomaga. Chcę napisać cały interfejs z D3. Logika biznesowa byłaby na serwerze. Co pozostało do wykorzystania Elma? – JimmyJames