简体   繁体   English

车把中的Javascript函数调用

[英]Javascript function call in Handlebar

I am trying to use a javascript function call that creates a d3 pie chart in handlebars template. 我正在尝试使用JavaScript函数调用来在车把模板中创建d3饼图。

Here is my script:- 这是我的脚本:

<style>
#name {
    color: black;
    float: left;
    width: 34%;
}

#group {
    color: red;
    float: left;
    width: 33%;
}

#wave {
    color: green;
    float: left;
    width: 33%
}



#chart {
    width: 350px;
    padding: 10px;
}

#footer {
    color: blue;
    clear: both;
    text-align: center;
    padding: 5px;
}


#header {
    background-color: white;
    color: white;
    text-align: center;
    padding: 10px;
}
</style>
<div id="test"></div>

<script id="template" type="text/x-handlebars-template"> 
{{#each this}}

<div id="header">
        <div id="wave" style="color: #000FFF; font-size: 28px">Wave</div>
        <div id="name" style="color: #000000; font-size: 28px">{{name}}</div>
        <div id="group" style="color: #000000; font-size: 28px">{{groupName}}</div>
 </div>


<div id="table">
    <table>
    <tr>
        <td><div id="chart">{{recommendedFoods 25 25 25 25}}</div></td>
    </tr>
</table>
</div>
<div id="footer">
    Questions? Contact us 
</div>
{{/each}}
</script>
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/mustache.js/0.7.0/mustache.min.js"></script>
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.js"></script>
<script>

 $(document).ready(function (){
     Handlebars.registerHelper("recommendedFoods", function(a,b,c,d) {
            var w = 200;
            var h = 200;
            var r = h / 2;
            d3.select("#chart").append("text").attr("text-anchor", "middle").style(
                    "font-size", "28px").style("text-decoration", "bold").text(
                    "Recommended");
            var color = d3.scale.ordinal().range(
                    [ "#ffe5ff", "#ffeee5", "#d0743c", "#ff8c00" ]);
            //GPVF
            var data = [ {
                "label" : "8",
                "value" : a
            }, {
                "label" : "3",
                "value" : b
            }, {
                "label" : "6",
                "value" : c
            }, {
                "label" : "2",
                "value" : d
            } ];

            var vis = d3.select('#chart').append("svg:svg").data([ data ]).attr(
                    "width", w).attr("height", h).append("svg:g").attr("transform",
                    "translate(" + r + "," + r + ")");
            var pie = d3.layout.pie().value(function(d) {
                return d.value;
            });

            // declare an arc generator function
            var arc = d3.svg.arc().outerRadius(r);

            // select paths, use arc generator to draw
            var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g")
                    .attr("class", "slice");

            arcs.append("svg:path").attr("fill", function(d, i) {
                return color(i);
                // return color(d.data.value)
            }).attr("d", function(d) {
                console.log(arc(d));
                return arc(d);
            }).attr('stroke', '#fff') // <-- THIS
            .attr('stroke-width', '3');

            // add the text
            arcs.append("svg:text").attr("transform", function(d) {
                d.innerRadius = 0;
                d.outerRadius = r;
                return "translate(" + arc.centroid(d) + ")";
            }).attr("text-anchor", "middle").text(function(d, i) {
                return data[i].label;
            });
        //}
        return this;
        });

     var source = $("#template").html();
     var template = Handlebars.compile(source);
    var string = [{"groupName":"Default Group","name":"Dummy"},{"groupName":"New","name":"Becker"}];
    var ht = template(string);
    $("#test").html(ht);


});

</script>

The recommendedFoods function is being executed properly if I call it in the script without using it in the template. 如果我在脚本中调用它而没有在模板中使用它,则recommendedFoods函数将正确执行。 But , I am trying to return this in the function recommendedFood and I do not see anything being displayed on the output. 但是,我试图在recommendedFood的函数中return this ,但我看不到输出中显示任何内容。 Can anyone please help me fix this. 谁能帮我解决这个问题。 What should be returned from the function so that it can be displayed using the handlebars 应该从函数返回什么,以便可以使用把手显示它

That's because by the time you call Handlebars helper there is no #chart element in the DOM yet. 这是因为,当您调用Handlebars helper时,DOM中还没有#chart元素。

So you need to: 因此,您需要:

  1. change #chart to class .chart because you will have multiple elements 改变#chart上课.chart因为你将有多个元素
  2. build your charts after Handlebars executes. 在把手执行后建立您的图表。
  3. store values for your charts eg in the same strings object where you already have some relevant info. 将图表的值存储在例如已经具有一些相关信息的相同strings对象中。

Checkout demo - Fiddle . 结帐演示- 小提琴

Code: 码:

$(document).ready(function() {

    var source = $("#template").html();
    var template = Handlebars.compile(source);
    var string = [{
        "groupName": "Default Group",
        "name": "Dummy",
        "values": [25, 25, 25, 25]
    }, {
        "groupName": "New",
        "name": "Becker",
        "values": [10, 5, 25, 25]
    }];
    var ht = template(string);
    $("#test").html(ht);

    $('.chart').each(function(index, el) {

        var w = 200;
        var h = 200;
        var r = h / 2;
        d3.select(el).append("text").attr("text-anchor", "middle").style(
            "font-size", "28px").style("text-decoration", "bold").text(
            "Recommended");
        var color = d3.scale.ordinal().range(
            ["#ffe5ff", "#ffeee5", "#d0743c", "#ff8c00"]);
        //GPVF
        var data = [{
            "label": "8",
            "value": string[index].values[0]
        }, {
            "label": "3",
            "value": string[index].values[1]
        }, {
            "label": "6",
            "value": string[index].values[2]
        }, {
            "label": "2",
            "value": string[index].values[3]
        }];

        var vis = d3.select(el).append("svg:svg").data([data]).attr(
            "width", w).attr("height", h).append("svg:g").attr("transform",
            "translate(" + r + "," + r + ")");
        var pie = d3.layout.pie().value(function(d) {
            return d.value;
        });

        // declare an arc generator function
        var arc = d3.svg.arc().outerRadius(r);

        // select paths, use arc generator to draw
        var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g").attr("class", "slice");

        arcs.append("svg:path").attr({
            "fill": function(d, i) {
                return color(i);
            },
            "d": function(d) {
                console.log(arc(d));
                return arc(d);
            },
            'stroke': '#fff',
            'stroke-width': '3'
        });

        // add the text
        arcs.append("svg:text").attr({
            "transform": function(d) {
                d.innerRadius = 0;
                d.outerRadius = r;
                return "translate(" + arc.centroid(d) + ")";
            },
            "text-anchor": "middle"
        }).text(function(d, i) {
            return data[i].label;
        });

    });

})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM