2017-02-15 19 views
6

Có thể quản lý bằng D3 bằng Elm bằng cổng không? Tôi đang thử Elm nhưng tôi không thể tìm thấy bất kỳ ví dụ về việc sử dụng Elm với D3 mà không có một API wrapper. Vấn đề tôi gặp phải là wrapper và các nhánh không hoạt động với 0,18. Tôi cũng thấy rất nhiều câu lệnh đề xuất xây dựng một API xung quanh API javascript là thực hành không tốt và thay vào đó bạn nên sử dụng cổng. Tôi không thể tìm thấy bất kỳ ví dụ về điều này với D3, tuy nhiên. Tôi tìm thấy this example nhưng phần D3 đã được thực hiện tất cả trong javascript đơn giản mà không thực sự phù hợp.Sử dụng D3 với Elm

Tôi có thể quá hung hăng với việc sử dụng D3 ngay lập tức với Elm nhưng đó thực sự là những gì tôi muốn làm với nó. Nếu nó không thực sự khả thi để sử dụng D3 với Elm tôi có lẽ sẽ không bận tâm với nó cho bây giờ. Có một vấn đề cơ bản với loại tương tác này hay đơn giản là thiếu sự quan tâm đến D3 trong cộng đồng Elm hoặc tôi chỉ thiếu một cái gì đó?

Ví dụ, lấy mã này tách từ ví dụ bl.ocks trên:

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); 

Có một bản dịch đơn giản vào Elm cho loại điều?

+1

Dưới đây là một ví dụ về làm việc với cảng và một thư viện JS lớn (Google Maps) http: //simonh1000.github .io/2016/12/elm-ports-google-maps/Nó có thể giúp bạn –

+0

@SimonH Cảm ơn sự hỗ trợ của bạn. Tôi đã xem xét một số điều như thế này, nhưng nơi tôi đấu tranh là d3 sử dụng rất nhiều tham chiếu phương pháp. Bạn cần truyền các hàm và các hàm gọi trên hàm trả về các hàm (cũng là các đối tượng). Tôi là không biết làm thế nào để làm điều này trong Elm vì vậy đó là nơi tôi đã hy vọng tìm thấy một ví dụ làm việc (đơn giản) để bắt đầu từ. – JimmyJames

+0

Bạn có thể cung cấp một ví dụ mã về những gì bạn phải vượt qua cổng. Mở rộng câu hỏi của bạn để cho thấy chức năng nào bạn muốn truy cập trong D3 từ Elm –

Trả lời

3

Tôi chỉ biết một chút về D3. Bạn sẽ muốn đặt tất cả các xử lý dữ liệu trong Elm và chỉ chuyển dữ liệu ra mã js điều khiển D3. Điều đó sẽ giữ cho mô hình của bạn lành mạnh.

Bạn cũng cần phải chú ý đến việc D3 thay đổi DOM vì sau đó Elm sẽ đấu tranh để cập nhật các phần của trang mà nó chịu trách nhiệm. Tốt nhất là để khắc lên trang của bạn với các bộ phận elm và các bộ phận khác bằng cách sử dụng Elm.embed. Nhưng bạn có thể có Elm viết toàn bộ trang và để D3 thay đổi DOM nếu bạn sử dụng Html.keyed để giúp Elm theo dõi những gì trong DOM.

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

Bạn có thể bỏ qua các chức năng truyền như vậy thông qua cổng nhưng bạn có thể chuyển json. vì vậy bạn có thể sử dụng elm để tạo ra một cái gì đó giống như

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

Sau đó, bạn có thể trong js làm một

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

Vì vậy, các loại tương tác với javascript trong mã ví dụ không thể có trong Elm? – JimmyJames

+0

vấn đề là mã bạn đề xuất thay đổi DOM và _could_ nhầm lẫn cập nhật DOM của Elm. Tôi không chắc chắn chắc chắn và nó có thể cố gắng bao giờ để chắc chắn.Nhưng sử dụng keyed sẽ giúp –

+0

OK, đó là hữu ích nhưng những gì tôi thực sự đang tìm kiếm là giúp đỡ về cách tôi có thể chuyển các chức năng cho D3 và cách lấy các hàm/đối tượng từ D3 để truyền chúng trở lại D3. Các tài liệu interop cho Elm mà tôi đã tìm thấy dường như chỉ nói về các tương tác đơn giản. Sở thích của tôi (ít nhất là ban đầu) thực sự là để làm tất cả các bài thuyết trình với D3. Nó có thể xử lý bất kỳ thao tác DOM, không chỉ SVG, vv – JimmyJames

0

Vấn đề của bạn có thể được giải quyết bằng cách sử dụng webcomponent như multi-chart.

nhập các thành phần bên trong index.html và tạo ra một nút với các thuộc tính bạn muốn:

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

Tôi không làm thế nào điều này trả lời câu hỏi. Cụ thể, tôi không thấy bất cứ điều gì với dự án này liên quan đến Elm. – JimmyJames

+0

Những gì tôi muốn chỉ ra rằng trong hầu hết trường hợp, cách tốt nhất để làm interop với javascript và Elm không sử dụng cổng nhưng để sử dụng các thành phần web. Tôi đã học được từ sáu tháng sử dụng Elm trong các ứng dụng sản xuất. Vui lòng kiểm tra bài nói chuyện này từ rtfeldman: https://www.youtube.com/watch?v=ar3TakwE8o0e – Lisard

+0

Tôi đoán tôi không chắc chắn cách thức đó giúp tôi. Tôi muốn viết toàn bộ giao diện người dùng với D3. Logic nghiệp vụ sẽ nằm trên máy chủ. Những gì còn lại mà tôi sẽ sử dụng Elm cho? – JimmyJames

Các vấn đề liên quan